"""
Hệ Thống Tự Động Học & Gắn Ngọc Kỹ Năng (POE2 Gem Socket & Auto-Combo Manager)
Quản lý Uncut Skill Gems, Uncut Support Gems và thiết lập Combo theo meta Leveling.
"""

from dataclasses import dataclass, field
from enum import Enum
from typing import Dict, List, Optional


class GemCategory(Enum):
    ACTIVE_SKILL = "ACTIVE_SKILL"
    SUPPORT_GEM = "SUPPORT_GEM"
    SPIRIT_GEM = "SPIRIT_GEM"


@dataclass
class GemRecommendation:
    gem_name: str
    category: GemCategory
    tier_level: int
    weapon_set: int              # Set vũ khí (1 hoặc 2)
    role: str                    # "PRIMER", "MAIN_DPS", "STAGGER_FINISHER", "SUPPORT"
    description: str


@dataclass
class Poe2ActiveSkillLoadout:
    """Mô hình kỹ năng chủ động gắn trong bảng Gem Menu (Phím G) của POE2."""
    name: str
    key_binding: str             # "Q", "W", "E", "R", "T", "LMB", "RMB", "MMB"
    weapon_set: int = 1          # 1 hoặc 2 (0 = bất kỳ)
    level: int = 1
    support_gems: List[str] = field(default_factory=list) # Tối đa 5 support gems linked
    role: str = "MAIN_DPS"
    description: str = ""


# Bảng cấu hình bộ kỹ năng khởi đầu tối ưu (Meta Starter Leveling Profiles)
STARTER_PROFILES: Dict[str, List[GemRecommendation]] = {
    "WARRIOR_MELEE": [
        GemRecommendation("Cleave", GemCategory.ACTIVE_SKILL, 1, 1, "MAIN_DPS", "Kỹ năng quét dọn bầy quái cấp thấp"),
        GemRecommendation("Sunder", GemCategory.ACTIVE_SKILL, 4, 1, "PRIMER", "Gây choáng và tích lũy thanh Stagger cực nhanh"),
        GemRecommendation("Boneshatter", GemCategory.ACTIVE_SKILL, 8, 1, "STAGGER_FINISHER", "Đòn dứt điểm bộc phá khi quái bị Stagger 100%"),
        GemRecommendation("Brutality Support", GemCategory.SUPPORT_GEM, 1, 1, "SUPPORT", "Tăng mạnh sát thương vật lý thuần"),
    ],
    "SORCERESS_SPELL": [
        GemRecommendation("Spark", GemCategory.ACTIVE_SKILL, 1, 1, "MAIN_DPS", "Tia sét dọn dẹp map rộng xuyên tường"),
        GemRecommendation("Frost Wall", GemCategory.ACTIVE_SKILL, 4, 2, "PRIMER", "Cản quái và tích tụ hiệu ứng Đóng Băng Freeze"),
        GemRecommendation("Lightning Conduit", GemCategory.ACTIVE_SKILL, 8, 1, "STAGGER_FINISHER", "Xả sét hủy diệt khi mục tiêu bị Shock"),
        GemRecommendation("Faster Casting", GemCategory.SUPPORT_GEM, 1, 1, "SUPPORT", "Tăng tốc độ niệm phép"),
    ],
    "MERCENARY_CROSSBOW": [
        GemRecommendation("Rapid Shot", GemCategory.ACTIVE_SKILL, 1, 1, "MAIN_DPS", "Bắn nỏ liên thanh tốc độ cao"),
        GemRecommendation("Cryo Ammo", GemCategory.ACTIVE_SKILL, 2, 2, "PRIMER", "Băng đạn đóng băng làm chậm toàn bộ quái áp sát"),
        GemRecommendation("Armor Piercing Finisher", GemCategory.ACTIVE_SKILL, 6, 1, "STAGGER_FINISHER", "Xuyên giáp kết liễu Boss gục ngã"),
        GemRecommendation("Multiple Projectiles", GemCategory.SUPPORT_GEM, 1, 1, "SUPPORT", "Bắn tỏa nhiều mũi tên"),
    ],
    "MONK_MARTIAL_ARTIST": [
        GemRecommendation("Whirling Assault", GemCategory.ACTIVE_SKILL, 1, 1, "MAIN_DPS", "Kỹ năng xoay quét dọn map và dồn hit cận chiến liên tục"),
        GemRecommendation("Hollow Form", GemCategory.ACTIVE_SKILL, 1, 1, "PRIMER", "Kỹ năng Thăng hoa Spirit triệu hồi ảo ảnh mô phỏng đòn đánh"),
        GemRecommendation("Hollow Focus", GemCategory.ACTIVE_SKILL, 1, 1, "STAGGER_FINISHER", "Chuông tâm linh khuếch đại diện tích và dồn Stagger"),
        GemRecommendation("Martial Tempo", GemCategory.SUPPORT_GEM, 1, 1, "SUPPORT", "Tăng mạnh tốc độ ra chiêu và chuỗi liên hoàn"),
    ]
}


class GemManager:
    """
    Quản lý ngọc kỹ năng và ngọc hỗ trợ theo cơ chế POE2 (Bảng Gem phím G).
    Khóa bất biến INV-NO-AUTO-EQUIP-IN-COMBAT: Không tự tiện tráo đổi đồ/gem khi đang farm.
    """

    def __init__(self, build_archetype: str = "MONK_MARTIAL_ARTIST"):
        self.build_archetype = build_archetype
        self.profile = STARTER_PROFILES.get(build_archetype, STARTER_PROFILES["MONK_MARTIAL_ARTIST"])
        self.engraved_gems: List[str] = []
        self.socketed_gems: List[str] = []
        self.active_skills: Dict[str, Poe2ActiveSkillLoadout] = {}
        self._init_default_loadout()

    def _init_default_loadout(self):
        """Khởi tạo cấu hình kỹ năng chuẩn theo Archetype."""
        if self.build_archetype == "MONK_MARTIAL_ARTIST":
            self.bind_active_skill(Poe2ActiveSkillLoadout(
                name="Whirling Assault", key_binding="Q", weapon_set=1, role="MAIN_DPS",
                support_gems=["Martial Tempo", "Faster Attacks"]
            ))
            self.bind_active_skill(Poe2ActiveSkillLoadout(
                name="Hollow Form", key_binding="RMB", weapon_set=1, role="PRIMER",
                support_gems=["Spirit Reservation"]
            ))
            self.bind_active_skill(Poe2ActiveSkillLoadout(
                name="Hollow Focus", key_binding="R", weapon_set=1, role="STAGGER_FINISHER",
                support_gems=["Concentrated Effect"]
            ))
            self.bind_active_skill(Poe2ActiveSkillLoadout(
                name="Tempest Bell", key_binding="T", weapon_set=1, role="BURST_AOE",
                support_gems=["Added Lightning Damage"]
            ))

    def bind_active_skill(self, skill: Poe2ActiveSkillLoadout):
        """Gắn một kỹ năng chủ động vào bảng kỹ năng của nhân vật."""
        self.active_skills[skill.name] = skill

    def link_support_gem(self, active_skill_name: str, support_gem_name: str) -> bool:
        """Gắn thêm ngọc hỗ trợ vào kỹ năng chủ động (Tối đa 5 ngọc)."""
        if active_skill_name in self.active_skills:
            skill = self.active_skills[active_skill_name]
            if support_gem_name not in skill.support_gems and len(skill.support_gems) < 5:
                skill.support_gems.append(support_gem_name)
                return True
        return False

    def get_skill_by_key(self, key: str) -> Optional[Poe2ActiveSkillLoadout]:
        """Tìm kỹ năng chủ động được gán cho phím bấm cụ thể."""
        key_upper = key.upper()
        for skill in self.active_skills.values():
            if skill.key_binding.upper() == key_upper:
                return skill
        return None

    def get_skills_for_weapon_set(self, weapon_set: int) -> List[Poe2ActiveSkillLoadout]:
        """Lấy danh sách các kỹ năng tương thích với Weapon Set (1 hoặc 2)."""
        return [s for s in self.active_skills.values() if s.weapon_set == 0 or s.weapon_set == weapon_set]

    def is_skill_available(self, skill_name: str, current_weapon_set: int) -> bool:
        """Kiểm tra kỹ năng có sử dụng được với bộ vũ khí đang kích hoạt hay không."""
        if skill_name in self.active_skills:
            req_set = self.active_skills[skill_name].weapon_set
            return (req_set == 0) or (req_set == current_weapon_set)
        return False

    def recommend_engraving(self, uncut_gem_level: int, is_support: bool = False) -> Optional[GemRecommendation]:
        """Đề xuất kỹ năng nên khắc từ Uncut Gem rơi ra."""
        cat = GemCategory.SUPPORT_GEM if is_support else GemCategory.ACTIVE_SKILL
        for rec in self.profile:
            if rec.category == cat and rec.tier_level <= uncut_gem_level:
                if rec.gem_name not in self.engraved_gems:
                    return rec
        return None

    def record_engraved(self, gem_name: str):
        """Ghi nhận gem đã khắc."""
        if gem_name not in self.engraved_gems:
            self.engraved_gems.append(gem_name)

    def record_socketed(self, gem_name: str):
        """Ghi nhận gem đã gắn vào bảng kỹ năng."""
        if gem_name not in self.socketed_gems:
            self.socketed_gems.append(gem_name)

    def get_status_summary(self) -> str:
        return f"Build: {self.build_archetype} | Active Skills: {len(self.active_skills)} | Engraved: {len(self.engraved_gems)} | Socketed: {len(self.socketed_gems)}"

