#pragma once

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <windows.h>
#include "memory/imemory_reader.hpp"

// ==========================================================
// MemoryReader (ReadProcessMemoryReader) - Back-end User-mode
// Đọc và ghi bộ nhớ tiến trình game qua Windows API
// ==========================================================
class MemoryReader : public IMemoryReader {
public:
    MemoryReader() = default;
    ~MemoryReader() override;

    MemoryReader(const MemoryReader&) = delete;
    MemoryReader& operator=(const MemoryReader&) = delete;
    MemoryReader(MemoryReader&& other) noexcept {
        m_handle = other.m_handle;
        m_pid = other.m_pid;
        other.m_handle = nullptr;
        other.m_pid = 0;
    }
    MemoryReader& operator=(MemoryReader&& other) noexcept {
        if (this != &other) {
            Detach();
            m_handle = other.m_handle;
            m_pid = other.m_pid;
            other.m_handle = nullptr;
            other.m_pid = 0;
        }
        return *this;
    }

    const char* BackendName() const override {
        return "ReadProcessMemory (User-mode)";
    }

    bool Attach(uint32_t pid) override;
    void Detach() override;
    bool Read(uintptr_t address, void* buffer, size_t size) override;
    bool Write(uintptr_t address, const void* buffer, size_t size) override;
    bool ForEachReadableRegion(const RegionFn& fn) override;
    bool ForEachHeapRegion(const RegionFn& fn) override;

    HANDLE RawHandle() const { return m_handle; }

private:
    HANDLE m_handle = nullptr;
};

// Alias for backward compatibility with AutoPOE2 naming
using ReadProcessMemoryReader = MemoryReader;
