"""
FreeExile Weapon Types, Enums and Data Models.
Defines Weapon Classifications, Grip Styles, Clan & Sect Affinities,
Implicit Modifiers, and Scaling Contracts for Grimdark Savage Primal ARPG.
"""

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

from server.world.martial_types import FiveElements, MartialSect, WeaponCategory, AttributeAffinity


class PrimalClan(str, Enum):
    """5 Cổ Tộc Man Hoang (Primal Savage Clans) trong thế giới lưu đày."""
    CRIMSON_BLOOD = "CRIMSON_BLOOD"   # Xích Huyết Man Tộc (Cương Thể - STR: Trọng Đao, Chiến Phủ, Chùy)
    GALE_PHANTOM = "GALE_PHANTOM"     # Thanh Phong Tật Tộc (Thân Pháp - DEX: Cốt Kiếm, Đoản Đao, Ám Khí)
    NETHER_WRAITH = "NETHER_WRAITH"   # U Minh Quỷ Tộc (Thần Thức - INT: Cốt Tiễn, Ma Cốt Trượng, Độc Châm)
    FROST_FERAL = "FROST_FERAL"       # Băng Sơn Thú Tộc (Hybrid DEX-INT: Băng Trượng, Băng Luân, Hộ Thuẫn)
    EARTH_TITAN = "EARTH_TITAN"       # Hám Địa Thạch Tộc (Hybrid STR-INT: Thiết Bổng, Cự Chùy, Quyền Cốt)


class WeaponClass(str, Enum):
    """Phân loại vũ khí chi tiết theo cơ chế chiến đấu."""
    SWORD = "SWORD"                   # Kiếm / Cốt Kiếm (Sắc bén, Bạo kích, Lôi điện)
    BLADE = "BLADE"                   # Đao / Tà Đao / Chiến Phủ (Chém xé thịt, Xuất huyết, Bộc hỏa)
    STAFF = "STAFF"                   # Trượng / Băng Trượng / Cốt Trượng (Pháp quyết, Ward, Băng sương)
    BLUNT_HAMMER = "BLUNT_HAMMER"     # Bổng / Chùy / Thiết Bổng (Choáng váng, Nện đất Slam, Phá giáp)
    RANGED_BOW = "RANGED_BOW"         # Cung / Nỏ / Ám Khí (Đâm xuyên, Độc tố DoT, Bắn tỉa)
    FERAL_CLAW = "FERAL_CLAW"         # Móng Vuốt / Quyền Cốt / Tay Không (Hút máu, Tốc độ, Phản kích)
    SHIELD = "SHIELD"                 # Hộ Thân Thuẫn / Cốt Bài (Chặn đòn Block, Giáp hộ thân, Ward)


class GripStyle(str, Enum):
    """Kiểu cầm vũ khí ảnh hưởng trực tiếp đến cơ chế chiến đấu PoE2."""
    ONE_HANDED = "ONE_HANDED"         # Cầm 1 tay (Cho phép Dual Wield hoặc kèm Khiên)
    TWO_HANDED = "TWO_HANDED"         # Cầm 2 tay (+50% More Base Dmg, Tầm đánh xa, Slam AoE rộng)
    OFFHAND_SHIELD = "OFFHAND_SHIELD" # Khiên phòng ngự tay phụ


class WeaponImplicitStat(str, Enum):
    """Thuộc tính cố định (Implicit Modifiers) theo phôi vũ khí chuẩn PoE2."""
    GLOBAL_CRIT_CHANCE = "GLOBAL_CRIT_CHANCE"           # Tăng % Tỉ lệ Bạo Kích
    GLOBAL_CRIT_MULTIPLIER = "GLOBAL_CRIT_MULTIPLIER"   # Tăng % Sát Thương Bạo Kích
    MELEE_BLEED_CHANCE = "MELEE_BLEED_CHANCE"           # % Gây Xuất Huyết khi trúng đòn
    FIRE_PENETRATION = "FIRE_PENETRATION"               # % Xuyên Kháng Hỏa
    LIGHTNING_PENETRATION = "LIGHTNING_PENETRATION"     # % Xuyên Kháng Lôi
    COLD_PENETRATION = "COLD_PENETRATION"               # % Xuyên Kháng Băng
    POISON_DOT_MULTIPLIER = "POISON_DOT_MULTIPLIER"     # % Sát Thương Độc Tố DoT
    ADDITIONAL_PIERCE = "ADDITIONAL_PIERCE"             # Số lượng mục tiêu đâm xuyên
    STUN_THRESHOLD_REDUCTION = "STUN_THRESHOLD_REDUCTION" # % Giảm ngưỡng kháng Choáng của địch
    STUN_DURATION_BONUS = "STUN_DURATION_BONUS"         # % Thời gian duy trì Choáng
    SLAM_AOE_RADIUS_BONUS = "SLAM_AOE_RADIUS_BONUS"     # % Bán kính đòn Slam nện đất
    MAX_WARD_BONUS = "MAX_WARD_BONUS"                   # % Tăng Hộ Thể Ward Barrier
    LIFE_ON_HIT = "LIFE_ON_HIT"                         # Hút Khí Huyết trực tiếp mỗi đòn trúng
    BLOCK_CHANCE = "BLOCK_CHANCE"                       # % Tỉ lệ Chặn Đòn (Block)


@dataclass(slots=True, frozen=True)
class WeaponImplicitMod:
    """Định nghĩa 1 dòng thuộc tính cố định trên phôi vũ khí."""
    stat: WeaponImplicitStat
    value: float
    description: str


@dataclass(slots=True, frozen=True)
class BaseWeaponTemplate:
    """Khuôn mẫu phôi vũ khí chuẩn hóa (Server-Authoritative Base Item)."""
    weapon_id: str
    name_vi: str
    name_en: str
    weapon_class: WeaponClass
    category: WeaponCategory
    grip_style: GripStyle
    sect_affinity: MartialSect
    clan_affinity: PrimalClan
    element: FiveElements
    required_level: int
    req_physique: int
    req_agility: int
    req_mind: int
    min_damage: float
    max_damage: float
    elemental_min_damage: float = 0.0
    elemental_max_damage: float = 0.0
    attacks_per_second: float = 1.0
    base_crit_chance: float = 0.05
    weapon_range_meters: float = 1.5
    implicit_mod: Optional[WeaponImplicitMod] = None


@dataclass(slots=True)
class EquippedWeapon:
    """Vũ khí thực tế đang được trang bị trên người nhân vật."""
    template: BaseWeaponTemplate
    quality: int = 0
    custom_affixes: List[Dict[str, float]] = field(default_factory=list)


@dataclass(slots=True)
class WeaponSetLoadout:
    """Một bộ vũ khí gồm Tay Chính (Mainhand) và Tay Phụ (Offhand)."""
    mainhand: Optional[EquippedWeapon] = None
    offhand: Optional[EquippedWeapon] = None


@dataclass(slots=True, frozen=True)
class DualWieldBonus:
    """Buff nội tại khi trang bị Song Binh 2 Tay (Dual Wielding)."""
    more_attack_speed: float = 0.10   # +10% More Attack Speed
    bonus_block_chance: float = 0.15  # +15% Tỉ lệ Chặn Đòn cơ bản


@dataclass(slots=True, frozen=True)
class WeaponScalingResult:
    """Kết quả tính toán sát thương vũ khí sau khi áp dụng Căn Cốt & Kiểu Cầm."""
    min_damage: float
    max_damage: float
    effective_attack_speed: float
    final_crit_chance: float
    effective_dps: float
    weapon_reach_meters: float
    stun_potency_multiplier: float
    bonus_block_chance: float
    is_two_handed: bool
    is_dual_wield: bool


@dataclass(slots=True, frozen=True)
class AffinityResonanceResult:
    """Kết quả cộng hưởng môn phái & huyết mạch tộc hệ khi dùng đúng sở trường."""
    has_sect_resonance: bool
    has_clan_resonance: bool
    total_damage_multiplier: float
    bonus_crit_multiplier: float
    bonus_stun_duration: float
    description: str


@dataclass(slots=True, frozen=True)
class AutoSwapResult:
    """Kết quả xử lý Song Binh Hoán Chuyển 0ms khi tung chiêu."""
    swapped: bool
    new_active_set: int
    selected_weapon: Optional[EquippedWeapon]
    reason: str


@dataclass(slots=True, frozen=True)
class LoadoutEvaluationResult:
    """Tổng hợp chỉ số của một bộ vũ khí hoàn chỉnh."""
    has_shield: bool
    is_dual_wield: bool
    total_block_chance: float
    bonus_armor: float
    bonus_ward: float
    combined_dps: float
