#pragma once

#include <cstdint>
#include <cstring>
#include "common/protocol.hpp"

namespace common {

// ==========================================================
// AutoPOE2 - Common Zone Classifier (Single Source of Truth)
// Phân loại khu vực game POE2 tập trung cho toàn bộ hệ thống
// ==========================================================

enum class ZoneKind : uint8_t {
    Unknown = 0,
    Town = 1,        // Làng campaign Act 1-3, Caravan, Encampment
    Hideout = 2,     // Hideout người chơi (Shoreline, etc.)
    CombatMap = 3    // Bản đồ Endgame chiến đấu, phụ bản có quái
};

inline const char* ZoneKindToString(ZoneKind kind) {
    switch (kind) {
        case ZoneKind::Town: return "Town";
        case ZoneKind::Hideout: return "Hideout";
        case ZoneKind::CombatMap: return "CombatMap";
        default: return "Unknown";
    }
}

inline ZoneKind ClassifyZone(const AreaTelemetryData& area) {
    if (area.areaName[0] != '\0') {
        if (std::strstr(area.areaName, "Hideout")) {
            return ZoneKind::Hideout;
        }
        if (std::strstr(area.areaName, "Encampment") ||
            std::strstr(area.areaName, "Caravan") ||
            std::strstr(area.areaName, "Town")) {
            return ZoneKind::Town;
        }
    }
    if (area.areaCode[0] != '\0') {
        if (std::strstr(area.areaCode, "hideout") || std::strstr(area.areaCode, "Hideout")) {
            return ZoneKind::Hideout;
        }
        if (std::strstr(area.areaCode, "town") || std::strstr(area.areaCode, "Town")) {
            return ZoneKind::Town;
        }
        if (std::strstr(area.areaCode, "map") || std::strstr(area.areaCode, "Map")) {
            return ZoneKind::CombatMap;
        }
    }

    if (area.areaSeed != 0) {
        return ZoneKind::CombatMap;
    }
    return ZoneKind::Unknown;
}

inline bool IsTownOrHideout(ZoneKind kind) {
    return kind == ZoneKind::Town || kind == ZoneKind::Hideout;
}

} // namespace common
