#pragma once

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#ifndef NOMINMAX
#define NOMINMAX
#endif

#include <cstdint>
#include <array>
#include <cmath>
#include <algorithm>

#include "common/protocol.hpp"

namespace navigation { class TerrainGrid; }

namespace combat {

/**
 * @brief Cụm quái vật (Monster Pack Cluster) trong Tier 1 Hot Path 120Hz.
 * POD 64 bytes (1 cache line), Zero Heap Allocation.
 */
struct alignas(64) MonsterPackCluster {
    float centroidX = 0.0f;          // Tọa độ tâm cụm quái X
    float centroidY = 0.0f;          // Tọa độ tâm cụm quái Y
    float spreadRadius = 0.0f;       // Bán kính bao bọc cụm quái
    float distanceToPlayer = 0.0f;   // Khoảng cách từ người chơi tới tâm cụm
    float velocityX = 0.0f;          // Vận tốc trôi trung bình của cụm (u/s)
    float velocityY = 0.0f;          // Vận tốc trôi trung bình của cụm (u/s)
    uint16_t monsterCount = 0;       // Số lượng quái trong cụm
    uint16_t rareOrBossCount = 0;    // Số lượng quái Rare/Boss
    uint16_t staggeredCount = 0;     // Số lượng quái đang bị Stagger
    uint32_t primaryTargetId = 0;    // ID mục tiêu hạt nhân (Boss hoặc quái gần nhất)
    float priorityScore = 0.0f;      // Điểm ưu tiên chiến thuật
    bool hasBoss = false;            // Cụm chứa Boss bản đồ
    bool hasLineOfSight = true;      // Không bị cản trở tầm nhìn bởi tường
};

/**
 * @brief Cấu hình phân cụm bãi quái tự động.
 */
struct MonsterPackConfig {
    float clusterRadius = 100.0f;      // Bán kính gom quái vào một cụm (100u)
    float maxScanRadius = 450.0f;      // Tầm quét tối đa của radar (450u)
    uint16_t minPackSizeForAoE = 3;    // Tối thiểu 3 quái kích hoạt chiêu thức AoE (Tempest Bell / Staff Wave)
    float threatWeightBoss = 800.0f;   // Trọng số ưu tiên Boss
    float threatWeightRare = 300.0f;   // Trọng số ưu tiên quái Rare
    float densityWeight = 120.0f;      // Trọng số mật độ số lượng quái
    float distanceWeight = 1.0f;       // Hệ số phạt khoảng cách
    float losBonus = 500.0f;           // Điểm thưởng khi có Line-of-Sight
};

/**
 * @brief Kết quả gom cụm bãi quái (Zero Dynamic Allocation).
 */
struct MonsterPackClusterResult {
    static constexpr size_t kMaxClusters = 8;
    std::array<MonsterPackCluster, kMaxClusters> clusters{};
    size_t clusterCount = 0;
    int bestClusterIndex = -1;
    uint32_t totalMonstersNear = 0;

    const MonsterPackCluster* BestCluster() const {
        if (bestClusterIndex >= 0 && static_cast<size_t>(bestClusterIndex) < clusterCount) {
            return &clusters[static_cast<size_t>(bestClusterIndex)];
        }
        return nullptr;
    }
};

/**
 * @brief MonsterPackClusterer - Bộ Phân Cụm Quái Vật 120Hz (Data-Oriented Design).
 * 
 * Nhiệm vụ:
 * 1. Gom các thực thể quái vật đơn lẻ thành các Cụm Bãi Quái (Monster Packs) trong cự ly 100u.
 * 2. Tính toán trọng tâm (Centroid) để tung chiêu AoE chính xác (Tempest Bell, Charged Staff).
 * 3. Chấm điểm ưu tiên bãi quái: Mật độ quái cao + Chứa Boss/Rare + Có tầm nhìn thẳng.
 * 4. Không cấp phát động (0 heap allocation, < 0.02ms latency).
 */
class MonsterPackClusterer {
public:
    explicit MonsterPackClusterer(const MonsterPackConfig& config = MonsterPackConfig{});

    void SetConfig(const MonsterPackConfig& config) { m_config = config; }
    const MonsterPackConfig& Config() const { return m_config; }

    /**
     * @brief Phân cụm và đánh giá bãi quái từ gói Telemetry.
     * O(N), 0 dynamic allocations, SIMD/DOD friendly.
     */
    MonsterPackClusterResult ClusterPacks(const TelemetryPacket& packet,
                                         const navigation::TerrainGrid* grid = nullptr) const;

private:
    MonsterPackConfig m_config;
};

} // namespace combat
