"""
FreeExile Ascendancy & Flesh Metamorphosis Domain Types.
Strictly typed dataclasses and enums for the 10-trial Ascendancy progression,
Minor, Notable, and Keystone nodes, and Paradigm Shifters.
"""

from __future__ import annotations
from dataclasses import dataclass, field
from enum import Enum
from typing import Dict, List, Optional, Set, Any


class AscendancyNodeType(str, Enum):
    MINOR = "MINOR"        # Node nhỏ: +chỉ số cơ bản vượt trội (+15% Dmg, +10% HP...)
    NOTABLE = "NOTABLE"    # Node to: Cơ chế chiến thuật mạnh (+chấn động, nổ xác...)
    KEYSTONE = "KEYSTONE"  # Node to đặc trưng hệ phái: Thay đổi toàn bộ item/skill/stats


class KeystoneParadigm(str, Enum):
    ITEM_MUTATION = "ITEM_MUTATION"               # Thay đổi toàn bộ cơ chế trang bị
    SKILL_TRANSFORMATION = "SKILL_TRANSFORMATION" # Thay đổi cơ chế/nguyên tố/tiêu hao chiêu thức
    STAT_MUTATION = "STAT_MUTATION"               # Thay đổi toàn bộ chỉ số căn cốt & sinh mệnh


class AscendancyClassId(str, Enum):
    # Kim (Thanh Phong Kiếm Tông)
    TUYET_MENH_KIEM_MA = "TUYET_MENH_KIEM_MA"     # Void Blade Sovereign
    LOI_ANH_THAN_HANH = "LOI_ANH_THAN_HANH"       # Thunder Phantom
    # Mộc (U Minh Độc Y)
    THI_COT_VU_HOANG = "THI_COT_VU_HOANG"         # Plague Corpse Witch
    HUYET_TUY_MA_Y = "HUYET_TUY_MA_Y"             # Blood Siphon Ascetic
    # Thủy (Hàn Băng Thần Điện)
    BANG_CUC_MA_QUAN = "BANG_CUC_MA_QUAN"         # Absolute Frost Tyrant
    HAN_KINH_HO_THAN = "HAN_KINH_HO_THAN"         # Glacial Mirror Aegis
    # Hỏa (Liệt Diễm Cuồng Đao)
    HUYET_NGUC_CUONG_MA = "HUYET_NGUC_CUONG_MA"   # Bloodfire Berserker
    LIET_THIEN_HOA_TON = "LIET_THIEN_HOA_TON"     # Infernal Cataclysm
    # Thổ (Kim Cang Man Binh)
    BAT_HOAI_MAN_VUONG = "BAT_HOAI_MAN_VUONG"     # Indomitable Titan
    DIA_CHAN_TRUY_THAN = "DIA_CHAN_TRUY_THAN"     # Earthquake Juggernaut


@dataclass(slots=True, frozen=True)
class AscendancyTrial:
    """Đại diện cho 1 trong 10 Thử Thách Thí Luyện Cổ Đàn."""
    trial_index: int                  # 1 đến 10
    trial_id: str
    name_vi: str
    name_en: str
    required_level: int
    zone_name: str
    boss_name: str
    mechanic_desc: str
    reward_points: int = 3            # Mỗi lần hoàn thành thưởng đúng 3 điểm


@dataclass(slots=True, frozen=True)
class AscendancyNode:
    """Mắt xích thiên phú trong Cây Huyết Cốt Thăng Hoa."""
    node_id: int
    name_vi: str
    name_en: str
    node_type: AscendancyNodeType
    class_id: AscendancyClassId
    points_cost: int                  # Minor=1, Notable=2, Keystone=3
    description: str
    stat_modifiers: Dict[str, float] = field(default_factory=dict)
    keystone_paradigm: Optional[KeystoneParadigm] = None
    paradigm_rule_id: Optional[str] = None
    prerequisite_node_ids: List[int] = field(default_factory=list)


@dataclass(slots=True)
class CharacterAscendancyState:
    """Trạng thái tiến trình Thăng hoa & Thiên phú của nhân vật."""
    actor_id: int
    chosen_class: Optional[AscendancyClassId] = None
    completed_trials: Set[int] = field(default_factory=set)
    allocated_nodes: Set[int] = field(default_factory=set)

    @property
    def total_points_earned(self) -> int:
        return len(self.completed_trials) * 3

    @property
    def max_trials_count(self) -> int:
        return 10

    @property
    def max_possible_points(self) -> int:
        return 30


@dataclass(slots=True, frozen=True)
class AscendancyAppliedEffects:
    """Kết quả tính toán sau khi áp dụng các Node Thăng Hoa lên nhân vật."""
    # Stats Scaling
    hp_multiplier: float = 1.0
    qi_multiplier: float = 1.0
    ward_multiplier: float = 1.0
    armor_multiplier: float = 1.0
    damage_multiplier: float = 1.0
    attack_speed_bonus: float = 0.0
    cast_speed_bonus: float = 0.0
    crit_chance_bonus: float = 0.0
    crit_multiplier_bonus: float = 0.0
    penetration_bonus: float = 0.0

    # Overridden Base Stats
    forced_max_hp: Optional[float] = None
    forced_max_qi: Optional[float] = None
    forced_max_ward: Optional[float] = None
    attribute_conversions: Dict[str, str] = field(default_factory=dict)

    # Item Overrides & Restrictions
    offhand_disabled: bool = False
    jewelry_disabled: bool = False
    two_hand_stat_boost: float = 1.0
    armor_converts_to_bone_plate: bool = False
    elemental_taken_as_physical: float = 0.0

    # Skill Mutations
    skills_cost_life: bool = False
    skills_convert_to_chaos: bool = False
    strikes_convert_to_slam: bool = False
    skills_damage_boost: float = 1.0
    cooldown_multiplier: float = 1.0

    # Defenses & Ailments
    chaos_immune: bool = False
    poison_immune: bool = False
    mind_over_matter_ratio: float = 0.0
    avatar_metamorphosis_active: bool = False
    max_resists_bonus: float = 0.0
    active_paradigm_rules: List[str] = field(default_factory=list)
