"""
Combat Types, Enums and Data Models for FreeExile.
Defines DamageChannels, Combatant Types, Boss Stagger & Enrage States,
Ailments, Damage Packets, Defense Sheets, and Hit Results.
"""

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


class DamageChannel(str, Enum):
    """Core damage channels in FreeExile."""
    PHYSICAL = "PHYSICAL"    # Cương Kình (Vật lý - mitigated by non-linear Armour)
    FIRE = "FIRE"            # Liệt Diễm (Hỏa - mitigated by Fire Resistance)
    COLD = "COLD"            # Băng Phách (Thủy - mitigated by Cold Resistance)
    LIGHTNING = "LIGHTNING"  # Huyết Lôi (Kim/Lôi - mitigated by Lightning Resistance)
    CHAOS = "CHAOS"          # Hủ Độc / Tà Khí (Chaos - bypasses Ward partially, mitigated by Chaos Res)


class CombatantType(str, Enum):
    """Categorization of combat entities."""
    PLAYER = "PLAYER"
    MINION = "MINION"
    MONSTER_COMMON = "MONSTER_COMMON"
    MONSTER_MAGIC = "MONSTER_MAGIC"
    MONSTER_RARE = "MONSTER_RARE"
    BOSS = "BOSS"


class AilmentType(str, Enum):
    """Elemental and physical ailments."""
    IGNITE = "IGNITE"        # Thiêu đốt DoT (Hỏa)
    CHILL = "CHILL"          # Làm chậm tốc độ di chuyển và xuất chiêu (Thủy)
    FREEZE = "FREEZE"        # Đóng băng bất động hoàn toàn (Thủy)
    SHOCK = "SHOCK"          # Tăng % sát thương nhận vào (Lôi)
    BLEED = "BLEED"          # Xuất huyết DoT khi di chuyển (Vật lý)
    POISON = "POISON"        # Hủ độc cộng dồn DoT (Chaos)


class BossPhase(str, Enum):
    """Multi-phase enrage stages for Map Bosses and Pinnacle Bosses."""
    PHASE_1_NORMAL = "PHASE_1_NORMAL"             # 100% -> 66% HP: Đòn đánh cơ bản
    PHASE_2_ENRAGED = "PHASE_2_ENRAGED"           # 66% -> 33% HP: Cuồng Nộ Huyết Sát (+25% Dmg, +15% Spd)
    PHASE_3_SAVAGE_FRENZY = "PHASE_3_SAVAGE_FRENZY" # < 33% HP: Bản Năng Diệt Tuyệt (+50% Dmg, +25% Pen)
    STAGGERED = "STAGGERED"                       # Bị đánh gãy thế (Knockdown 4.0s, +30% Dmg taken)


@dataclass(slots=True, frozen=True)
class DamageVector:
    """Multi-channel raw damage values for a single attack or spell."""
    physical: float = 0.0
    fire: float = 0.0
    cold: float = 0.0
    lightning: float = 0.0
    chaos: float = 0.0

    def total_raw(self) -> float:
        return self.physical + self.fire + self.cold + self.lightning + self.chaos

    def get_channel(self, channel: DamageChannel) -> float:
        if channel == DamageChannel.PHYSICAL:
            return self.physical
        elif channel == DamageChannel.FIRE:
            return self.fire
        elif channel == DamageChannel.COLD:
            return self.cold
        elif channel == DamageChannel.LIGHTNING:
            return self.lightning
        elif channel == DamageChannel.CHAOS:
            return self.chaos
        return 0.0


@dataclass(slots=True)
class DamagePacket:
    """Outgoing attack payload sent from attacker to damage calculation pipeline."""
    attacker_id: int
    combatant_type: CombatantType
    attacker_level: int
    damage_vector: DamageVector
    accuracy: float = 1000.0
    crit_chance: float = 0.05
    crit_multiplier: float = 1.50
    elemental_penetration: Dict[DamageChannel, float] = field(default_factory=dict)
    increased_damage_pct: float = 0.0
    more_damage_multipliers: List[float] = field(default_factory=list)
    is_aoe: bool = False
    stagger_impact: float = 0.0
    ailment_chance: Dict[AilmentType, float] = field(default_factory=dict)


@dataclass(slots=True)
class DefenseSheet:
    """Incoming defense parameters for an entity receiving damage."""
    defender_id: int
    combatant_type: CombatantType
    defender_level: int
    max_life: float = 1000.0
    current_life: float = 1000.0
    max_ward: float = 0.0
    current_ward: float = 0.0
    armour: float = 0.0
    evasion_rating: float = 0.0
    resistances: Dict[DamageChannel, float] = field(default_factory=dict)
    max_resistance_caps: Dict[DamageChannel, float] = field(default_factory=dict)
    block_chance: float = 0.0
    entropy_pool: int = 50
    is_in_iframe: bool = False
    damage_taken_multiplier: float = 1.0
    aoe_damage_reduction_pct: float = 0.0


@dataclass(slots=True)
class BossStaggerState:
    """PoE2-inspired Poise / Stagger meter for Bosses."""
    max_stagger_poise: float
    current_stagger: float = 0.0
    is_staggered: bool = False
    stagger_duration_remaining_sec: float = 0.0
    stagger_cooldown_remaining_sec: float = 0.0
    stagger_damage_amplification: float = 1.30  # +30% damage taken while staggered


@dataclass(slots=True, frozen=True)
class AilmentApplication:
    """Result of an inflicted status ailment."""
    ailment_type: AilmentType
    duration_sec: float
    magnitude: float
    dps: float = 0.0


@dataclass(slots=True)
class CombatHitResult:
    """Comprehensive outcome of a hit evaluated by the Damage Calculator."""
    is_hit: bool
    is_evaded: bool
    is_blocked: bool
    is_critical: bool
    raw_damage_total: float
    mitigated_damage_by_channel: Dict[DamageChannel, float]
    absorbed_by_ward: float
    damage_to_life: float
    final_total_damage: float
    defender_life_remaining: float
    defender_ward_remaining: float
    inflicted_ailments: List[AilmentApplication] = field(default_factory=list)
    stagger_inflicted: float = 0.0
    boss_staggered_triggered: bool = False
    boss_phase_transition: Optional[BossPhase] = None
