#pragma once

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <cstdint>
#include <vector>
#include <string>
#include <chrono>
#include "memory/aob_scanner.hpp"
#include "memory/imemory_reader.hpp"

namespace memory {

struct SignatureRoot {
    std::string name;
    AobPattern pattern;
    size_t ripOffset = 3;
    uintptr_t resolvedAddress = 0;
};

class SimdSignatureScanner {
public:
    // Kiểm tra CPU có hỗ trợ tập lệnh AVX2 hay không (thông qua __cpuid)
    static bool IsAvx2Supported();

    // Tìm kiếm pattern nhị phân bằng AVX2 (xử lý 32 byte mỗi chu kỳ, Dual-byte filter)
    // Trả về offset trong data (0-based), hoặc -1 nếu không tìm thấy
    static intptr_t FindPatternAVX2(
        const uint8_t* data,
        size_t dataSize,
        const AobPattern& pattern
    );

    // Thu thập tất cả các điểm khớp pattern trong buffer bằng AVX2
    static std::vector<intptr_t> FindAllHitsAVX2(
        const uint8_t* data,
        size_t dataSize,
        const AobPattern& pattern,
        size_t maxHits = 32
    );

    // Quét vi sai cửa sổ bộ nhớ Player 16MB tìm các float hợp lệ [fmin, fmax] bằng AVX2
    // Xử lý song song 8 float (256-bit) mỗi lệnh
    // Thời gian quét 16MB < 1.5 ms
    static size_t ScanFloatRangeAVX2(
        const uint8_t* buffer,
        size_t bufferSize,
        uintptr_t baseAddress,
        float fmin,
        float fmax,
        std::vector<std::pair<uintptr_t, float>>& outFloats
    );

    // Quét và định vị 8 Static Roots chính của POE2 trong thời gian < 3ms
    static bool ScanStaticRootsBatched(
        const uint8_t* peSectionData,
        size_t sectionSize,
        uintptr_t sectionBaseRva,
        std::vector<SignatureRoot>& roots,
        float* outDurationMs = nullptr
    );
};

} // namespace memory
