"""
FreeExile Martial Matrix Types, Enums, and Data Contracts.
Defines Ma Võ Tàn Cốt (Active Skill Bone Relics), Dị Biến Tà Ấn (Feral Mutator Glyphs),
Weapon Loadouts, and Damage Models for the Grimdark Savage Martial ARPG.
"""

from __future__ import annotations
from dataclasses import dataclass, field
from enum import Enum
from typing import Dict, List, Optional, Set


class FiveElements(str, Enum):
    KIM = "KIM"     # Cương Khí / Kim (Thanh Phong Kiếm Tông - Sắc Bén, Xuyên Giáp, Bạo Kích)
    MOC = "MOC"     # U Minh Độc Khí / Mộc (U Minh Độc Y - Độc Tố DoT, Lây Lan, Hút Máu)
    THUY = "THUY"   # Băng Hàn / Thủy (Hàn Băng Thần Điện - Đóng Băng, Làm Chậm, Hộ Thể)
    HOA = "HOA"     # Liệt Diễm / Hỏa (Liệt Diễm Cuồng Đao - Bộc Hỏa, AoE Khủng, Thiêu Đốt)
    THO = "THO"     # Hộ Thể / Thổ (Kim Cang Tông - Địa Chấn, Giáp Trọng, Phản Đòn, Choáng)


class MartialSect(str, Enum):
    THANH_PHONG = "THANH_PHONG" # Kim: Thanh Phong Kiếm Tông
    U_MINH = "U_MINH"           # Mộc: U Minh Độc Y
    HAN_BANG = "HAN_BANG"       # Thủy: Hàn Băng Thần Điện
    LIET_DIEM = "LIET_DIEM"     # Hỏa: Liệt Diễm Cuồng Đao
    KIM_CANG = "KIM_CANG"       # Thổ: Kim Cang Tông


class AttributeAffinity(str, Enum):
    PHYSIQUE = "PHYSIQUE"       # Cương Thể (Red / STR - Cận chiến, Trọng kích, Giáp, Máu)
    AGILITY = "AGILITY"         # Thân Pháp (Green / DEX - Tốc độ, Né tránh, Bạo kích, Xạ kích)
    MIND = "MIND"               # Thần Thức (Blue / INT - Khí công, Sấm sét, Hộ thể, Bùa chú)
    HYBRID_PHYSIQUE_AGILITY = "HYBRID_PHYSIQUE_AGILITY" # Cương + Thân (Xích Huyết Cuồng Sát)
    HYBRID_AGILITY_MIND = "HYBRID_AGILITY_MIND"         # Thân + Thần (U Minh Quỷ Đạo)
    HYBRID_PHYSIQUE_MIND = "HYBRID_PHYSIQUE_MIND"       # Cương + Thần (Kim Cang Lôi Thần)
    UNIVERSAL = "UNIVERSAL"     # Tự do / Toàn năng


class TagCategory(str, Enum):
    DELIVERY = "DELIVERY"       # Phương thức thi triển (Attack, Spell, Warcry, etc.)
    SHAPE = "SHAPE"             # Hình thái không gian (Melee, Strike, Slam, Projectile, AoE, etc.)
    ELEMENT = "ELEMENT"         # Nguyên tố & Sát thương (Physical, Fire, Cold, Lightning, Poison, Chaos)
    AILMENT = "AILMENT"         # Trạng thái dị thường (Bleed, Ignite, Freeze, Chill, Shock, Stun, Corrosion)
    MECHANIC = "MECHANIC"       # Cơ chế tương tác (DoT, Guard, Movement, Retaliation, Chaining, Piercing)
    COMBO = "COMBO"             # Chuỗi chiêu thức PoE2 (Combo Starter, Combo Finisher, Armor Break, Corpse)
    ATTRIBUTE = "ATTRIBUTE"     # Hệ Căn Cốt (Physique, Agility, Mind)
    WEAPON = "WEAPON"           # Ràng buộc vũ khí


class ComboRole(str, Enum):
    INDEPENDENT = "INDEPENDENT"         # Độc lập không cần combo
    COMBO_STARTER = "COMBO_STARTER"     # Đòn mở thế / Mồi bẫy / Găm ấn
    COMBO_FINISHER = "COMBO_FINISHER"   # Đòn dứt điểm / Kích nổ bộc phát
    COMBO_BRIDGE = "COMBO_BRIDGE"       # Đòn nối tiếp / Chuyển thế
    SUSTAIN = "SUSTAIN"                 # Đòn duy trì / Hồi phục nộ khí


class SkillTag(str, Enum):
    # --- Delivery (Phương thức) ---
    ATTACK = "ATTACK"                   # Đòn đánh vũ khí
    SPELL = "SPELL"                     # Khí công / Pháp quyết
    WARCRY = "WARCRY"                   # Hống kình / Tiếng gầm bùa chú
    TOTEM = "TOTEM"                     # Tế đàn / Cột cắm hoang dã
    MINION = "MINION"                   # Triệu hồi âm binh
    AURA = "AURA"                       # Hào quang nội công
    HEX = "HEX"                         # Bùa chú nguyền rủa
    MARK = "MARK"                       # Dấu ấn tà thuật đơn mục tiêu
    CHANNELING = "CHANNELING"           # Tụ khí / Vận công liên tục
    RETALIATION = "RETALIATION"         # Phản kích sau khi Đỡ đòn (Block/Parry)
    GUARD = "GUARD"                     # Phòng thủ lâm thời

    # --- Shape & Targeting (Không gian & Hình thái) ---
    MELEE = "MELEE"                     # Cận chiến
    STRIKE = "STRIKE"                   # Đòn đánh chuẩn xác đơn mục tiêu
    SLAM = "SLAM"                       # Trọng kích nện đất chấn động
    PROJECTILE = "PROJECTILE"           # Đạn đạo / Phi kiếm / Ám khí
    AOE = "AOE"                         # Vùng ảnh hưởng diện rộng
    CHAINING = "CHAINING"               # Nảy chuỗi mục tiêu
    PIERCING = "PIERCING"               # Đâm xuyên mục tiêu
    FORKING = "FORKING"                 # Tách nhánh khi va chạm
    BARRAGE = "BARRAGE"                 # Liên hoàn bắn dồn dập
    NOVA = "NOVA"                       # Tỏa tròn 360 độ từ tâm

    # --- Element & Damage (Nguyên tố & Sát thương) ---
    PHYSICAL = "PHYSICAL"               # Vật lý / Cương kình
    FIRE = "FIRE"                       # Thuộc tính Hỏa
    COLD = "COLD"                       # Thuộc tính Thủy Băng
    LIGHTNING = "LIGHTNING"             # Thuộc tính Kim Lôi
    POISON = "POISON"                   # Thuộc tính Mộc Độc
    CHAOS = "CHAOS"                     # Thuộc tính Tà Khí Hỗn Mang
    DOT = "DOT"                         # Sát thương theo thời gian

    # --- Ailments & Debuffs (Trạng thái dị thường) ---
    BLEED = "BLEED"                     # Xuất huyết (chảy máu khi di chuyển)
    IGNITE = "IGNITE"                   # Thiêu đốt bốc cháy
    FREEZE = "FREEZE"                   # Đóng băng bất động
    CHILL = "CHILL"                     # Hàn khí làm chậm
    SHOCK = "SHOCK"                     # Sốc điện khuếch đại sát thương
    CORROSION = "CORROSION"             # Ăn mòn giáp và phòng ngự
    STUN = "STUN"                       # Choáng váng tích lũy thanh Stun

    # --- PoE2 Mechanics & Synergies (Cơ chế Combo) ---
    COMBO_STARTER = "COMBO_STARTER"     # Khai chiêu / Mồi ấn
    COMBO_FINISHER = "COMBO_FINISHER"   # Kích nổ / Tuyệt sát
    ARMOR_BREAK = "ARMOR_BREAK"         # Phá hủy lớp giáp cứng
    CORPSE = "CORPSE"                   # Tương tác với xác chết
    DEFENSIVE = "DEFENSIVE"             # Hộ thể / Phòng thủ
    MOVEMENT = "MOVEMENT"               # Thân pháp / Cơ động

    # --- Attribute Alignment (Định vị Căn Cốt) ---
    PHYSIQUE_ALIGNED = "PHYSIQUE_ALIGNED" # Căn Cốt Cương Thể
    AGILITY_ALIGNED = "AGILITY_ALIGNED"   # Căn Cốt Thân Pháp
    MIND_ALIGNED = "MIND_ALIGNED"         # Căn Cốt Thần Thức


class WeaponCategory(str, Enum):
    UNARMED = "UNARMED"                 # Quyền sáo / Tay không
    SWORD = "SWORD"                     # Đơn kiếm / Song kiếm
    BLADE = "BLADE"                     # Đại đao / Trường đao
    STAFF = "STAFF"                     # Thiền trượng / Pháp trượng
    PROJECTILE_WEAPON = "PROJECTILE_WEAPON" # Ám khí / Cung tiễn
    ANY = "ANY"                         # Không bắt buộc vũ khí cụ thể


class SigilAugmentType(str, Enum):
    MULTI_PROJECTILE = "MULTI_PROJECTILE" # Phân Quang (Thêm tia đạn)
    AREA_OF_EFFECT = "AREA_OF_EFFECT"     # Bộc Phá (Tăng diện tích nổ)
    CHAIN_LIGHTNING = "CHAIN_LIGHTNING"   # Lôi Đạn (Nảy chuỗi mục tiêu)
    DAMAGE_BOOST = "DAMAGE_BOOST"         # Kình Lực (Khuếch đại sát thương)
    BLOOD_MAGIC = "BLOOD_MAGIC"           # Huyết Khí Quy Tông (Dùng Máu thay Chân Khí)
    RAPID_CAST = "RAPID_CAST"             # Cuồng Phong Liên Hoàn (Tăng tốc độ xuất chiêu)
    FREEZE_AFFLICTION = "FREEZE_AFFLICTION" # Hàn Khí Cực Lãnh (Khống chế cứng)
    CRIT_MARTYR = "CRIT_MARTYR"           # Thất Thương Quyết (Bạo kích bộc phát + phản chấn)
    BRUTAL_PHYSICAL = "BRUTAL_PHYSICAL"   # Khắc Cương Liệt Khí (Phá giáp + cấm ngũ hành)
    TACTICAL_RETREAT = "TACTICAL_RETREAT" # Thần Thân Hoán Vị (Lùi né sau khi xuất chiêu)


@dataclass(slots=True, frozen=True)
class WeaponItem:
    weapon_id: int
    name: str
    category: WeaponCategory
    base_physical_damage: float = 30.0
    base_attack_speed: float = 1.0
    crit_chance: float = 0.05


@dataclass(slots=True)
class CharacterLoadout:
    """Hồ sơ nhân vật chứa Căn Cốt (Attributes), Khí Huyết, Chân Khí và Song Binh."""
    actor_id: int
    name: str
    sect: MartialSect
    cuong_the: int = 50         # Physique / Strength: Tăng HP, sát thương Cận chiến/Vật lý
    than_phap: int = 50         # Agility / Dexterity: Tăng Né tránh, Tốc độ đánh, Bạo kích
    than_niem: int = 50         # Spirit / Intelligence: Tăng Chân Khí, Hồi Chân Khí, Sát thương Pháp/Ngũ Hành, Hộ Thể
    current_hp: float = 1000.0
    max_hp: float = 1000.0
    current_qi: float = 500.0
    max_qi: float = 500.0
    ward_barrier: float = 200.0 # Hộ Thể Chân Khí (Ward / Energy Barrier)
    max_ward_barrier: float = 200.0
    active_weapon_set: int = 1  # 1 hoặc 2
    weapon_set_1: Optional[WeaponItem] = None
    weapon_set_2: Optional[WeaponItem] = None


@dataclass(slots=True, frozen=True)
class DiBienTaAn:
    """
    Dị Biến Tà Ấn (Transmutation Sigil / Support Gem).
    Tuân thủ triết lý cân bằng PoE2: Lợi thế rõ rệt (Upside) luôn đi kèm Đánh đổi thích đáng (Downside).
    """
    sigil_id: int
    sigil_name: str
    augment_type: SigilAugmentType
    required_tags: frozenset[SkillTag]
    upside_desc: str
    downside_desc: str

    damage_multiplier: float = 1.0
    projectile_bonus: int = 0
    aoe_radius_bonus: float = 0.0
    aoe_radius_multiplier: float = 1.0
    chain_count_bonus: int = 0
    energy_cost_multiplier: float = 1.0
    cooldown_multiplier: float = 1.0
    cast_speed_multiplier: float = 1.0
    crit_chance_multiplier: float = 1.0
    crit_multiplier_bonus: float = 0.0
    recoil_damage_percent: float = 0.0
    converts_cost_to_life: bool = False
    disables_ward: bool = False
    disables_elemental_damage: bool = False
    disables_physical_damage: bool = False
    disables_piercing: bool = False
    forces_freeze_chance: float = 0.0
    disables_ignite_and_poison: bool = False
    dash_evasion_distance: float = 0.0
    attribute_affinity: AttributeAffinity = AttributeAffinity.UNIVERSAL
    excluded_tags: frozenset[SkillTag] = field(default_factory=frozenset)


@dataclass(slots=True)
class ChanVoDan:
    """
    Chân Võ Đan (Martial Core Elixir / Active Skill Gem).
    Mỗi chiêu thức mang linh hồn của 5 Tông Môn và Ngũ Hành, tích hợp cơ chế Trade-off nội tại.
    """
    skill_id: int
    skill_name: str
    element: FiveElements
    sect: MartialSect
    tags: frozenset[SkillTag]
    weapon_requirement: WeaponCategory
    base_damage: float
    energy_cost: int
    cooldown_ms: int
    cast_time_ms: int = 500
    animation_lock_ms: int = 250            # Thời gian khóa cứng chân khi thi triển
    upside_desc: str = ""
    downside_desc: str = ""
    base_projectile_count: int = 1
    base_aoe_radius: float = 0.0
    dot_multiplier: float = 0.0             # Sát thương theo thời gian (% base damage/s)
    dot_duration_sec: float = 0.0
    direct_hit_enabled: bool = True         # Có sát thương va chạm ban đầu không
    vulnerability_taken_multiplier: float = 1.0 # Tăng sát thương nhận vào khi đang xuất chiêu
    speed_penalty_percent: float = 0.0      # Giảm tốc chạy trong khi duy trì chiêu
    self_damage_max_hp_percent: float = 0.0 # Tự rút % Máu tối đa khi xuất chiêu
    minimum_range_meters: float = 0.0       # Khoảng cách tối thiểu để kích hoạt chiêu
    cannot_crit: bool = False               # Không thể bạo kích
    immobilized_during_effect: bool = False # Đứng bất động hoàn toàn khi chiêu kích hoạt
    max_linked_sigils: int = 5
    linked_sigils: List[DiBienTaAn] = field(default_factory=list)
    attribute_affinity: AttributeAffinity = AttributeAffinity.PHYSIQUE
    combo_role: ComboRole = ComboRole.INDEPENDENT


@dataclass(slots=True, frozen=True)
class CalculatedSkillDamage:
    final_damage: float
    damage_type: FiveElements
    is_crit: bool
    crit_multiplier: float
    effective_projectiles: int
    effective_aoe_radius: float
    final_energy_cost: int
    final_life_cost: int
    recoil_damage: float
    dash_distance: float


# Savage Grimdark Martial Aliases (PoE2 Spirit Realignment)
MaVoTanCot = ChanVoDan
DiBienTaAn = DiBienTaAn

