#pragma once

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <cstdint>
#include <vector>
#include <cmath>
#include "common/protocol.hpp"
#include "navigation/terrain_grid.hpp"
#include "navigation/pathfinder.hpp"

namespace combat {

struct KitingConfig {
    bool enabled = true;
    float dangerRadius = 135.0f;        // Bán kính quái áp sát kích hoạt thả diều
    float kiteStepDistance = 32.0f;     // Cự ly mỗi bước lùi né đòn (units)
    uint32_t stepIntervalMs = 280;      // Khoảng nghỉ giữa các nhịp Stutter-step (ms)
    float minSafeDistance = 85.0f;      // Ngưỡng cự ly nguy hiểm cực độ

    // Vector-Field Monster Kiting & Tangent Evacuation (CHU KỲ ĐIỀU PHỐI 4)
    bool enableTangentSliding = true;   // Bật chế độ trượt tiếp tuyến khi kẹt tường hoặc bị vây
    float surroundRadius = 25.0f;       // Bán kính quái bao vây dày đặc (units)
    uint32_t surroundThreatThreshold = 8;// Ngưỡng quái trong surroundRadius để kích hoạt Tangent Evacuation
    float wallProbeDistance = 24.0f;    // Cự ly dò tường chắn phía sau theo vector đẩy (units)
};

struct KitingState {
    uint64_t lastKiteStepMs = 0;
    bool isKiting = false;
    bool isTangentSlide = false;        // Cờ đánh dấu bước né hiện tại là Tangent Sliding
    navigation::Vec2 lastKiteTarget{0.0f, 0.0f};
    uint32_t totalKiteSteps = 0;
    uint32_t totalTangentSlides = 0;    // Số lần kích hoạt Tangent Sliding
};

class KitingEngine {
public:
    explicit KitingEngine(const KitingConfig& config = KitingConfig{});

    void SetConfig(const KitingConfig& config) { m_config = config; }
    const KitingConfig& Config() const { return m_config; }
    KitingState& State() { return m_state; }
    const KitingState& State() const { return m_state; }

    bool IsLastStepTangentSlide() const { return m_state.isTangentSlide; }

    // Tính toán vector né quái và tìm vị trí lùi an toàn
    // Trả về true nếu cần thực hiện bước lùi Stutter-Step
    bool ComputeKiteStep(
        const TelemetryPacket& packet,
        const navigation::TerrainGrid& grid,
        uint64_t nowMs,
        navigation::Vec2& outStepTarget
    );

private:
    struct ThreatItem {
        float dx = 0.0f;
        float dy = 0.0f;
        float dist = 0.0f;
    };

    // Dò tìm pháp tuyến tường chắn khi lùi vào chướng ngại vật (Zero Heap O(1))
    bool DetectWallNormal(
        float playerX,
        float playerY,
        const navigation::TerrainGrid& grid,
        float probeDist,
        float& outNormalX,
        float& outNormalY
    ) const;

    // Đánh giá mật độ quái dọc theo vector tiếp tuyến (Zero Heap O(N), N <= 32)
    float EvaluateTangentThreat(
        const ThreatItem* threats,
        uint32_t count,
        float tanX,
        float tanY
    ) const;

    KitingConfig m_config;
    KitingState m_state;
};

} // namespace combat
