#pragma once

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <windows.h>

#include "memory/imemory_reader.hpp"

// ==========================================================
// ReadProcessMemoryReader - Back-end User-mode mặc định
// Dễ debug nhất, nhưng bị chặn bởi UAC nếu game chạy Elevated
// (xem docs/research/01). Khi đó cần back-end DMA/Kernel.
// ==========================================================
class ReadProcessMemoryReader : public IMemoryReader {
public:
    ReadProcessMemoryReader() = default;
    ~ReadProcessMemoryReader() override;

    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 thô cho các tiện ích cần quyền tiến trình (VD: quét module)
    HANDLE RawHandle() const { return m_handle; }

private:
    HANDLE m_handle = nullptr;
};