"""
Value types, DTOs, and Enums for FreeExile Monster Ecosystem.
Defines Genus, Ranks, AI States, Aggression Profiles, and Procedural Monster specs.
"""

from dataclasses import dataclass, field
from enum import Enum, auto
from typing import Dict, List, Optional, Tuple
try:
    from server.world.martial_matrix import FiveElements
except ImportError:
    from world.martial_matrix import FiveElements



class MonsterGenus(str, Enum):
    RISEN_SKELETON = "RISEN_SKELETON"          # Hủ Cốt Khô Lâu
    FERAL_HELLHOUND = "FERAL_HELLHOUND"        # Hoang Vực Cuồng Khuyển
    BLOOD_CRAWLER = "BLOOD_CRAWLER"            # Huyết Trùng Hủ Độc
    SHADOW_WRAITH = "SHADOW_WRAITH"            # U Minh Dạ Bộc
    PRIMAL_CANNIBAL = "PRIMAL_CANNIBAL"        # Man Tộc Đoạt Mệnh
    IRONHIDE_BEHEMOTH = "IRONHIDE_BEHEMOTH"    # Hắc Giáp Ngưu Ma
    CORRUPTED_RAPTOR = "CORRUPTED_RAPTOR"      # Huyết Dực Dơi Đêm
    BRAMBLE_TREANT = "BRAMBLE_TREANT"          # Mộc Yêu Thụ Tinh
    TOMB_LORD = "TOMB_LORD"                    # Cổ Mộ Thi Vương
    FLESH_ABOMINATION = "FLESH_ABOMINATION"    # Huyết Nhục Cự Thú


class MonsterRank(str, Enum):
    COMMON = "COMMON"      # Quái thường (1.0x Scale, 1 Affix cơ bản)
    MAGIC = "MAGIC"        # Quái tinh anh (1.25x Scale, vòng hào quang, 1-2 Affixes)
    RARE = "RARE"          # Thủ lĩnh dị biến (1.55x Scale, Nemesis Aura, 3-4 Affixes)
    BOSS = "BOSS"          # Cổ Quái Độc Bản / Boss (2.0x - 2.8x Scale, Chiêu thức đa giai đoạn)


class MonsterAIState(str, Enum):
    IDLE = "IDLE"
    PATROL = "PATROL"
    ALERT = "ALERT"
    PURSUIT = "PURSUIT"
    ATTACK = "ATTACK"
    LEASH_RETURN = "LEASH_RETURN"
    DEAD = "DEAD"


class PackAuraType(str, Enum):
    HASTE = "HASTE"                          # Cuồng Tật: +30% Tốc chạy, -30% Windup/Cooldown
    DAMAGE_RESISTANCE = "DAMAGE_RESISTANCE"  # Thiết Cốt: +50% Giáp, +25% Toàn Kháng Nguyên Tố
    ELEMENTAL_EMPOWERMENT = "ELEMENTAL_EMPOWERMENT"  # Ngũ Hành: +40% Sát thương Nguyên Tố
    VAMPIRIC = "VAMPIRIC"                    # Phệ Huyết: Hồi 25% sát thương gây ra
    MORTAL_MIGHT = "MORTAL_MIGHT"            # Toái Cốt: +35% Sát thương, +20% Chí mạng


class MonsterAffixCategory(str, Enum):
    SURVIVAL_HP = "SURVIVAL_HP"
    SURVIVAL_DEFENSE = "SURVIVAL_DEFENSE"
    OFFENSIVE_DAMAGE = "OFFENSIVE_DAMAGE"
    ELEMENTAL_FIRE = "ELEMENTAL_FIRE"
    ELEMENTAL_LIGHTNING = "ELEMENTAL_LIGHTNING"
    TACTICAL_SPEED = "TACTICAL_SPEED"


@dataclass(slots=True, frozen=True)
class MonsterAffix:
    affix_id: str
    name: str
    category: MonsterAffixCategory
    tier: int                               # 1 (Apex) to 15 (Sơ Cấp)
    min_level: int
    stat_multipliers: Dict[str, float]      # {"hp_mult": 1.40, "dmg_mult": 1.25, ...}
    element: Optional[FiveElements] = None


@dataclass(slots=True, frozen=True)
class AggressionProfile:
    ferocity_index: float           # 0.0 -> 1.0 (Độ hung hăng tổng hợp)
    aggro_radius_meters: float      # Bán kính đánh hơi/phát hiện người chơi (4.0m -> 24.0m)
    leash_radius_meters: float      # Cự ly giới hạn truy đuổi trước khi quay về spawn (12m -> 45m)
    movement_speed: float           # Vận tốc truy sát (2.2 m/s -> 9.5 m/s)
    attack_windup_ms: int           # Thời gian chuẩn bị vung đòn (1800ms -> 180ms)
    attack_cooldown_ms: int         # Thời gian hồi giữa các đòn đánh (2500ms -> 350ms)
    flocking_cohesion: float        # Trọng số liên kết bầy đàn (0.0 -> 1.0)
    combo_hits: int                 # Số đòn đánh liên hoàn trong 1 chuỗi tấn công (1 -> 4)


@dataclass(slots=True, frozen=True)
class MonsterVisualProfile:
    base_scale: float               # Tỉ lệ phóng to/thu nhỏ render (0.75x -> 2.8x)
    collision_radius: float         # Bán kính va chạm vật lý (0.4m -> 2.5m)
    elemental_tint_hex: str         # Mã màu biến đổi chất liệu qua GPU Fragment Shader
    emissive_glow_intensity: float  # Cường độ phát sáng ma quỷ trên Normal/Emissive Map (0.0 -> 2.0)
    attachment_ids: List[str]       # Danh sách ID mảnh ghép ngoại trang (Sừng, gai lưng, xiềng xích...)
    palette_lut_index: int          # Chỉ số Color Look-Up Table (LUT) trong Compute Shader (0..15)


@dataclass(slots=True, frozen=True)
class ProceduralMonster:
    monster_id: int                 # Định danh thủ tục duy nhất (1 .. 10,000)
    level: int                      # Cấp độ quái vật (1 .. 100)
    name: str                       # Tên đầy đủ theo chuẩn Cổ Võ Hoang Dã
    genus: MonsterGenus             # 1 trong 10 họ quái vật cốt lõi
    sub_species_code: str           # Mã phân loài (100 loài)
    element: FiveElements           # Ngũ Hành (Kim, Mộc, Thủy, Hỏa, Thổ)
    rank: MonsterRank               # Phân cấp thể phách
    prefix: str                     # Tiền tố dị biến
    suffix: str                     # Hậu tố đặc tính
    max_hp: float                   # Lượng máu tối đa
    base_damage: float              # Sát thương cơ bản
    armor: float                    # Giáp giảm sát thương vật lý
    aggression: AggressionProfile   # Hồ sơ hung dữ & AI
    visual: MonsterVisualProfile    # Hồ sơ đồ họa & Shader
    experience_reward: int          # Điểm kinh nghiệm khi tiêu diệt
    loot_tier: int                  # Bậc rơi vật phẩm (iLvl & Bụi Huyết Cốt)
    pack_id: Optional[str] = None
    is_pack_leader: bool = False
    pack_leader_id: Optional[int] = None
    leader_aura: Optional[PackAuraType] = None
    affixes: Tuple[MonsterAffix, ...] = ()


@dataclass(slots=True)
class MonsterRuntimeState:
    monster: ProceduralMonster
    current_x: float
    current_y: float
    spawn_x: float
    spawn_y: float
    current_hp: float
    ai_state: MonsterAIState = MonsterAIState.IDLE
    target_actor_id: Optional[int] = None
    last_attack_timestamp_ms: int = 0
    is_invulnerable: bool = False
    pack_id: Optional[str] = None
    is_pack_leader: bool = False
    pack_leader_id: Optional[int] = None
    leader_aura: Optional[PackAuraType] = None
    affixes: Tuple[MonsterAffix, ...] = ()
    active_buffs: Dict[str, float] = field(default_factory=dict)


@dataclass(slots=True)
class MonsterPack:
    pack_id: str
    zone_id: str
    leader: ProceduralMonster
    minions: List[ProceduralMonster]
    center_x: float
    center_y: float
    pack_radius: float = 3.5


@dataclass(slots=True, frozen=True)
class MonsterAIAction:
    action_type: str                # "STAND", "PATROL", "MOVE_TOWARDS", "ATTACK", "RETURN_TO_SPAWN"
    target_x: float
    target_y: float
    damage_event: Optional[float] = None
