"""
FreeExile Feral NPC Types, Roles, Dialogue Nodes & Data Models.
Theme: CỔ VÕ HOANG DÃ & HẮC ÁM LƯU ĐÀY (Grimdark Savage Primal Exile ARPG - 100% PoE2 Spirit).
"""

from __future__ import annotations
from dataclasses import dataclass, field
from enum import Enum
try:
    from server.world.quest_types import QuestStatus
except ImportError:
    from world.quest_types import QuestStatus



class NpcRole(Enum):
    OUTCAST_SCAVENGER = "OUTCAST_SCAVENGER"         # Gian Thương Hắc Thị / Nhặt Xác (Barter Huyết Thạch, Cốt Đinh)
    BONE_BLACKSMITH = "BONE_BLACKSMITH"             # Thiết Tượng Huyết Đồ (Rèn Cốt Thiết, đúc U Minh Cốt Đinh)
    BLOOD_SHAMAN = "BLOOD_SHAMAN"                   # Huyết Vu Bà Bà (Tế Cốt, khơi thông Huyết Cốt Ma Đồ, Thú Tính)
    FERAL_TRACKER = "FERAL_TRACKER"                 # Thợ Săn Dã Ngoại (Trinh sát hoang dã, dò vết quái vật)
    SAVAGE_HERMIT = "SAVAGE_HERMIT"                 # Kẻ Điên Bão Cát / Dị Biến Ẩn Sĩ (Kỳ ngộ ẩn dã thú, khát máu)
    FERAL_SPIRIT = "FERAL_SPIRIT"                   # Chiến Hồn Tế Cốt (Anh linh chiến bại, khảo nghiệm tàn sát)
    WAR_CHIEF = "WAR_CHIEF"                         # Đầu Lĩnh Doanh Trại (Quy tắc sinh tồn kẻ mạnh)
    # Aliases for backward compatibility
    MERCHANT_BARTER = "OUTCAST_SCAVENGER"
    BLACKSMITH_ARTIFICER = "BONE_BLACKSMITH"
    MARTIAL_MASTER = "BLOOD_SHAMAN"
    QUEST_GIVER = "WAR_CHIEF"
    WANDERING_HERMIT = "SAVAGE_HERMIT"
    SECRET_CHAMBER_SPIRIT = "FERAL_SPIRIT"
    CARTOGRAPHER_SCOUT = "FERAL_TRACKER"


class NpcServiceType(Enum):
    DIALOGUE = "DIALOGUE"                           # Đàm đạo sinh tồn
    QUEST_DISPATCH = "QUEST_DISPATCH"               # Khế ước săn mồi & Thu nạp tàn cốt
    SHOP_VAULT = "SHOP_VAULT"                       # Mở Hắc Thị Hoang Vực (Barter Huyết Thạch)
    CRAFTING_FORGE = "CRAFTING_FORGE"               # Rèn Cốt Thiết & Khảm Cổ Cốt Ấn
    MERIDIAN_INSIGHT = "MERIDIAN_INSIGHT"           # Khảo sát Huyết Cốt Ma Đồ & Thức Tỉnh Thú Tính
    MAP_TELEPORT_GUIDE = "MAP_TELEPORT_GUIDE"       # Dẫn đường Thần Hành Trận & Cảnh báo dị tượng
    SECRET_TRIAL = "SECRET_TRIAL"                   # Hiến tế huyết nhục mở lối Mật Thất Cổ Ma


@dataclass(slots=True, frozen=True)
class NpcDialogueChoice:
    choice_id: str
    text: str
    target_node_id: Optional[str] = None
    required_level: int = 1
    required_quest_id: Optional[str] = None
    required_quest_status: Optional[QuestStatus] = None
    trigger_service: Optional[NpcServiceType] = None
    trigger_param: Optional[str] = None
    is_terminal: bool = False


@dataclass(slots=True, frozen=True)
class NpcDialogueNode:
    node_id: str
    speaker_title: str
    content: str
    voice_cue_id: Optional[str] = None
    choices: Tuple[NpcDialogueChoice, ...] = ()
    is_terminal: bool = False
    required_quest_id: Optional[str] = None
    required_quest_status: Optional[QuestStatus] = None


@dataclass(slots=True, frozen=True)
class NpcDialogueTree:
    tree_id: str
    default_root_node_id: str
    nodes: Dict[str, NpcDialogueNode]
    # quest_id -> {QuestStatus.name: node_id}
    quest_conditional_roots: Dict[str, Dict[str, str]] = field(default_factory=dict)


@dataclass(slots=True, frozen=True)
class NpcDefinition:
    npc_id: str
    name: str
    title: str
    role: NpcRole
    zone_id: str
    x: float
    y: float
    z: float = 0.0
    interaction_radius: float = 5.0
    supported_services: Tuple[NpcServiceType, ...] = ()
    dialogue_tree_id: str = ""
    required_level: int = 1
    required_quest_id: Optional[str] = None
    required_environment: Optional[str] = None  # e.g., SANDSTORM, MIASMA_TOXIC
    is_wandering: bool = False
    wander_radius: float = 0.0


@dataclass(slots=True)
class PlayerDialogueSession:
    player_id: str
    npc_id: str
    current_node_id: str
    started_at_ms: int
    last_interact_ms: int
