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

from typing import Dict, List, Any
from server.world.npc_types import (
    NpcRole,
    NpcServiceType,
    NpcDialogueChoice,
    NpcDialogueNode,
    NpcDialogueTree,
    NpcDefinition,
)


def create_canonical_dialogue_trees() -> Dict[str, NpcDialogueTree]:
    """Khởi tạo từ điển cây hội thoại hoang dã tiêu chuẩn."""
    trees: Dict[str, NpcDialogueTree] = {}

    # A. Lão Độc Cốt (Táng Kiếm Nhai / Vực Táng Cốt)
    trees["tree_doc_co_tan_kiem"] = NpcDialogueTree(
        tree_id="tree_doc_co_tan_kiem",
        default_root_node_id="node_doc_co_intro",
        nodes={
            "node_doc_co_intro": NpcDialogueNode(
                node_id="node_doc_co_intro",
                speaker_title="Kẻ Gọt Xương Cụt Tay",
                content=(
                    "Mùi máu tanh nồng... Ngươi vừa bị quẳng xuống Vực Táng Kiếm này sao? "
                    "Đừng nằm đó chờ lũ Thi Cẩu xé xác! Cầm lấy thanh tà đao mẻ này mà tự róc thịt cướp đường sống."
                ),
                choices=(
                    NpcDialogueChoice(
                        choice_id="choice_ask_situation",
                        text="Cánh tay trái của ngươi... sao lại chắp bằng xương thú?",
                        target_node_id="node_doc_co_lore",
                    ),
                    NpcDialogueChoice(
                        choice_id="choice_accept_first_quest",
                        text="Đưa đao đây! Lũ súc sinh đó đang ở đâu?",
                        target_node_id="node_doc_co_quest_offer",
                        trigger_service=NpcServiceType.QUEST_DISPATCH,
                        trigger_param="quest_intro_doc_co",
                    ),
                    NpcDialogueChoice(
                        choice_id="choice_inquire_ancient_sword_secret",
                        text="Trong tiếng gió rít qua khe đá, ta ngửi thấy mùi tàn tích cổ ma?",
                        target_node_id="node_doc_co_secret_hint",
                    ),
                ),
            ),
            "node_doc_co_lore": NpcDialogueNode(
                node_id="node_doc_co_lore",
                speaker_title="Kẻ Gọt Xương Cụt Tay",
                content=(
                    "Ba mươi năm trước, lũ phản nghịch bẻ gãy đao của ta, giáng ta xuống cõi chết này. "
                    "Tay gãy thì lấy sọ sói mà ghép, gân đứt thì lấy gân quái thú mà nối! "
                    "Ở đây không có thần phật nào cứu ngươi đâu, chỉ có bản năng khát máu mới giữ được mạng!"
                ),
                choices=(
                    NpcDialogueChoice(
                        choice_id="choice_lore_back",
                        text="Ta hiểu rồi. Kẻ yếu chỉ làm mồi cho thú hoang.",
                        target_node_id="node_doc_co_intro",
                    ),
                ),
            ),
            "node_doc_co_quest_offer": NpcDialogueNode(
                node_id="node_doc_co_quest_offer",
                speaker_title="Kẻ Gọt Xương Cụt Tay",
                content=(
                    "Tốt! Đi về phía gò đá bắc, băm nát bầy Hoang Giới Thi Cẩu, "
                    "đoạt lấy Huyết Tủy của chúng rồi quay lại đây!"
                ),
                choices=(
                    NpcDialogueChoice(
                        choice_id="choice_quest_accepted_leave",
                        text="Chờ xem ta xé xác chúng!",
                        is_terminal=True,
                    ),
                ),
            ),
            "node_doc_co_completed": NpcDialogueNode(
                node_id="node_doc_co_completed",
                speaker_title="Kẻ Gọt Xương Cụt Tay",
                content=(
                    "Mùi máu trên đao ngươi bắt đầu đậm rồi đấy... "
                    "Cầm lấy Hắc Sơ Thạch này mà gọt lại lưỡi đao, chuẩn bị bước vào Doanh Trại Vô Định!"
                ),
                choices=(
                    NpcDialogueChoice(
                        choice_id="choice_claim_reward",
                        text="Cầm lấy Huyết Tủy quái thú này!",
                        trigger_service=NpcServiceType.QUEST_DISPATCH,
                        trigger_param="quest_intro_doc_co",
                        target_node_id="node_doc_co_after_quest",
                    ),
                ),
            ),
            "node_doc_co_after_quest": NpcDialogueNode(
                node_id="node_doc_co_after_quest",
                speaker_title="Kẻ Gọt Xương Cụt Tay",
                content="Cút về Khu Trục Doanh Vô Định đi! Tìm mụ Huyết Vu và lũ thợ rèn mà khảm Cốt Đinh.",
                choices=(),
                is_terminal=True,
            ),
            "node_doc_co_secret_hint": NpcDialogueNode(
                node_id="node_doc_co_secret_hint",
                speaker_title="Kẻ Gọt Xương Cụt Tay",
                content=(
                    "Khịt khịt... Mũi thính đấy! Dưới đáy Cổ Kiếm Trũng có một hố chôn tàn binh từ ngàn năm trước. "
                    "Kẻ nào dám nhảy vào vũng máu đó mà không chết sẽ đoạt được Ma Võ Tàn Cốt!"
                ),
                choices=(
                    NpcDialogueChoice(
                        choice_id="choice_receive_secret",
                        text="Một manh mối đáng giá mạng người. Ta đi!",
                        target_node_id="node_doc_co_intro",
                    ),
                ),
            ),
            "node_doc_co_martial_talk": NpcDialogueNode(
                node_id="node_doc_co_martial_talk",
                speaker_title="Kẻ Gọt Xương Cụt Tay",
                content="Ngươi muốn học cách cắn xé hay cách chặt đầu đối thủ nhanh nhất?",
                choices=(
                    NpcDialogueChoice(
                        choice_id="choice_inquire_ancient_sword_secret",
                        text="Ta muốn đoạt lấy bí mật tàn sát vô song!",
                        target_node_id="node_doc_co_secret_hint",
                    ),
                ),
            ),
        },
        quest_conditional_roots={
            "quest_intro_doc_co": {
                "COMPLETED": "node_doc_co_completed",
                "CLAIMED": "node_doc_co_after_quest",
            }
        },
    )

    # B. Gian Thương Hắc Thị Cẩu Khấu (Quảng Trường / Doanh Trại Vô Định)
    trees["tree_van_gioi_merchant"] = NpcDialogueTree(
        tree_id="tree_van_gioi_merchant",
        default_root_node_id="node_merchant_intro",
        nodes={
            "node_merchant_intro": NpcDialogueNode(
                node_id="node_merchant_intro",
                speaker_title="Gian Thương Hắc Thị",
                content=(
                    "Ở cái hốc lưu đày này, tiền vàng hay giấy lộn của hoàng đế ngoài kia chỉ đáng nhóm lửa! "
                    "Ném Huyết Hồn Thạch, Cốt Đinh hoặc mẩu da dã thú ra đây! Cần đổi phôi đao bén hay gửi đồ vào Rương Hắc Thị?"
                ),
                choices=(
                    NpcDialogueChoice(
                        choice_id="choice_open_vault",
                        text="Mở Rương Hắc Thị (Consignment Vault), ta cần cất giấu tàn cốt quý.",
                        trigger_service=NpcServiceType.SHOP_VAULT,
                        target_node_id="node_merchant_vault_open",
                    ),
                ),
            ),
            "node_merchant_vault_open": NpcDialogueNode(
                node_id="node_merchant_vault_open",
                speaker_title="Gian Thương Hắc Thị",
                content="Kho đồ này được xích bằng xích sắt hai pha (2PC), bố bảo đứa nào dám thò tay ăn trộm!",
                choices=(),
                is_terminal=True,
            ),
        },
    )

    # C. Thám Tử Hắc Thị Bách Hiểu Sinh (Kẻ Giữ Tin Tức)
    trees["tree_bach_hieu_sinh"] = NpcDialogueTree(
        tree_id="tree_bach_hieu_sinh",
        default_root_node_id="node_bhs_intro",
        nodes={
            "node_bhs_intro": NpcDialogueNode(
                node_id="node_bhs_intro",
                speaker_title="Kẻ Săn Tin Hắc Thị",
                content=(
                    "Muốn sống sót ở Hoang Vực thì phải mua tin tức! "
                    "Vừa bò từ Vực Táng Kiếm lên à? Muốn biết hang ổ của con quái vật nào?"
                ),
                choices=(
                    NpcDialogueChoice(
                        choice_id="choice_bhs_world_intel",
                        text="Tình hình đại nạn tàn sát trong mùa giải này thế nào?",
                        target_node_id="node_bhs_intel_world",
                    ),
                    NpcDialogueChoice(
                        choice_id="choice_bhs_secret_chambers",
                        text="Mật Thất Cổ Ma chỉ xuất hiện khi nào?",
                        target_node_id="node_bhs_chambers_intel",
                    ),
                ),
            ),
            "node_bhs_intel_world": NpcDialogueNode(
                node_id="node_bhs_intel_world",
                speaker_title="Kẻ Săn Tin Hắc Thị",
                content=(
                    "Đại Nạn Hoang Vực sắp ập đến. Kẻ nào không tích đủ Huyết Hồn Thạch và "
                    "khắc kín Cốt Ấn lên người sẽ bị bão máu nghiền thành cám bã!"
                ),
                choices=(),
                is_terminal=True,
            ),
            "node_bhs_chambers_intel": NpcDialogueNode(
                node_id="node_bhs_chambers_intel",
                speaker_title="Kẻ Săn Tin Hắc Thị",
                content=(
                    "Mật thất làm gì có biển chỉ đường! Lúc máu ngươi gần cạn mà dùng Huyễn Ảnh Bộ né đòn chí mạng, "
                    "hoặc dâng nạp rượu huyết tế, Vòng Xoáy Hư Không mới nứt ra từ lòng đất."
                ),
                choices=(),
                is_terminal=True,
            ),
        },
    )

    # D. Thiết Tượng Huyết Đồ (Rèn Cốt Thiết & U Minh Cốt Đinh)
    trees["tree_au_da_tu"] = NpcDialogueTree(
        tree_id="tree_au_da_tu",
        default_root_node_id="node_smith_intro",
        nodes={
            "node_smith_intro": NpcDialogueNode(
                node_id="node_smith_intro",
                speaker_title="Thiết Tượng Huyết Đồ",
                content=(
                    "Keng! Keng! Đem xương quái chúa và phôi sắt gỉ lại đây! "
                    "Lửa lò của ta dùng máu đen dã thú để nung, đúc ra Tà Đao chém sắt như bùn!"
                ),
                choices=(
                    NpcDialogueChoice(
                        choice_id="choice_open_forge",
                        text="Khảm Cổ Cốt Ấn và đúc U Minh Cốt Đinh vào giáp cho ta.",
                        trigger_service=NpcServiceType.CRAFTING_FORGE,
                        target_node_id="node_smith_forge_open",
                    ),
                ),
            ),
            "node_smith_forge_open": NpcDialogueNode(
                node_id="node_smith_forge_open",
                speaker_title="Thiết Tượng Huyết Đồ",
                content="Búa đã nóng, máu đã sôi, đưa phôi đây!",
                choices=(),
                is_terminal=True,
            ),
        },
    )

    # E. Cuồng Nhân Bão Cát (Vô Định Bão Cát)
    trees["tree_sa_mac_hermit"] = NpcDialogueTree(
        tree_id="tree_sa_mac_hermit",
        default_root_node_id="node_hermit_intro",
        nodes={
            "node_hermit_intro": NpcDialogueNode(
                node_id="node_hermit_intro",
                speaker_title="Cuồng Nhân Bão Cát",
                content=(
                    "Khè khè... Cát đỏ táp vào mặt rách da rách thịt... Kẻ nào dám bước vào vùng chết này? "
                    "Nếu không có một hũ Hỗn Nguyên Huyết Tửu làm ấm cuống họng, ta xé xác ngươi làm mồi nhắm!"
                ),
                choices=(
                    NpcDialogueChoice(
                        choice_id="choice_give_wine",
                        text="Cầm lấy hũ Hỗn Nguyên Tửu này! Nuốt cho trôi rồi mở đường qua bão cát.",
                        trigger_service=NpcServiceType.QUEST_DISPATCH,
                        trigger_param="quest_deliver_ancient_wine",
                        target_node_id="node_hermit_wine_accepted",
                    ),
                ),
            ),
            "node_hermit_wine_accepted": NpcDialogueNode(
                node_id="node_hermit_wine_accepted",
                speaker_title="Cuồng Nhân Bão Cát",
                content="Gừ gừ! Rượu cay như máu quái vật! Được lắm, đi theo vết chân thú hướng đông, bão cát sẽ rẽ lối cho ngươi!",
                choices=(),
                is_terminal=True,
            ),
        },
    )

    return trees


def create_canonical_npcs() -> List[NpcDefinition]:
    """Khởi tạo danh sách NPC kinh điển phân bố trên các map."""
    return [
        # 1. Doanh Trại Vô Định (Outcast Camp / Sanctuary)
        NpcDefinition(
            npc_id="npc_bach_hieu_sinh",
            name="Bách Hiểu Sinh",
            title="Kẻ Săn Tin Hắc Thị",
            role=NpcRole.FERAL_TRACKER,
            zone_id="zone_boundless_sanctuary",
            x=15.0,
            y=15.0,
            interaction_radius=6.0,
            supported_services=(NpcServiceType.DIALOGUE, NpcServiceType.QUEST_DISPATCH, NpcServiceType.MAP_TELEPORT_GUIDE),
            dialogue_tree_id="tree_bach_hieu_sinh",
        ),
        NpcDefinition(
            npc_id="npc_van_gioi_thuong_nhan",
            name="Gian Thương Cẩu Khấu",
            title="Gian Thương Hắc Thị",
            role=NpcRole.OUTCAST_SCAVENGER,
            zone_id="zone_boundless_sanctuary",
            x=-25.0,
            y=20.0,
            interaction_radius=5.0,
            supported_services=(NpcServiceType.DIALOGUE, NpcServiceType.SHOP_VAULT),
            dialogue_tree_id="tree_van_gioi_merchant",
        ),
        NpcDefinition(
            npc_id="npc_thiet_tuong_au_da_tu",
            name="Thiết Tượng Huyết Đồ",
            title="Thợ Rèn Cốt Thiết",
            role=NpcRole.BONE_BLACKSMITH,
            zone_id="zone_boundless_sanctuary",
            x=30.0,
            y=-20.0,
            interaction_radius=5.0,
            supported_services=(NpcServiceType.DIALOGUE, NpcServiceType.CRAFTING_FORGE),
            dialogue_tree_id="tree_au_da_tu",
        ),
        NpcDefinition(
            npc_id="npc_chan_vo_truyen_thua",
            name="Huyết Vu Bà Bà",
            title="Trưởng Lão Tế Cốt",
            role=NpcRole.BLOOD_SHAMAN,
            zone_id="zone_boundless_sanctuary",
            x=0.0,
            y=45.0,
            interaction_radius=5.0,
            supported_services=(NpcServiceType.DIALOGUE, NpcServiceType.MERIDIAN_INSIGHT),
            dialogue_tree_id="tree_bach_hieu_sinh",
        ),
        # 2. Táng Kiếm Nhai / Vực Táng Cốt (Open World)
        NpcDefinition(
            npc_id="npc_doc_co_tan_kiem",
            name="Lão Độc Cốt",
            title="Kẻ Gọt Xương Cụt Tay",
            role=NpcRole.WAR_CHIEF,
            zone_id="zone_tang_kiem_nhai",
            x=60.0,
            y=55.0,
            interaction_radius=5.0,
            supported_services=(NpcServiceType.DIALOGUE, NpcServiceType.QUEST_DISPATCH),
            dialogue_tree_id="tree_doc_co_tan_kiem",
        ),
        NpcDefinition(
            npc_id="npc_tieu_dau_lao_ma",
            name="Thợ Săn Lão Mã",
            title="Trinh Sát Hoang Dã",
            role=NpcRole.FERAL_TRACKER,
            zone_id="zone_tang_kiem_nhai",
            x=220.0,
            y=175.0,
            interaction_radius=5.0,
            supported_services=(NpcServiceType.DIALOGUE, NpcServiceType.MAP_TELEPORT_GUIDE),
            dialogue_tree_id="tree_bach_hieu_sinh",
        ),
        # 3. Vô Định Bão Cát (Open World - Feral Sandstorm Zone)
        NpcDefinition(
            npc_id="npc_sa_mac_du_than",
            name="Cuồng Nhân Bão Cát",
            title="Dị Biến Ẩn Sĩ",
            role=NpcRole.SAVAGE_HERMIT,
            zone_id="zone_boundless_sandstorm",
            x=180.0,
            y=160.0,
            interaction_radius=6.0,
            required_environment="SANDSTORM",
            supported_services=(NpcServiceType.DIALOGUE, NpcServiceType.QUEST_DISPATCH, NpcServiceType.SECRET_TRIAL),
            dialogue_tree_id="tree_sa_mac_hermit",
        ),
    ]


def populate_canonical_npcs(engine: Any) -> None:
    """Nạp toàn bộ cây hội thoại và danh sách NPC kinh điển vào NpcEngine."""
    for tree in create_canonical_dialogue_trees().values():
        engine.register_dialogue_tree(tree)
    for npc in create_canonical_npcs():
        engine.register_npc(npc)
