"""
FreeExile Canonical Zone, Dungeon, and Secret Chamber Catalog.
Decoupled static data definitions for all standard maps, instances, and secret chambers.
"""

from __future__ import annotations
from typing import TYPE_CHECKING
from server.world.zone_types import (
    ZoneType,
    ZoneEnvironment,
    ZoneDefinition,
    Waypoint,
    ZonePortal,
    DungeonTemplate,
    SecretChamberTemplate,
)

if TYPE_CHECKING:
    from server.world.zone_engine import ZoneEngine


def register_canonical_zones_and_templates(engine: ZoneEngine) -> None:
    """Populates a ZoneEngine instance with canonical zones, dungeons, and secret chambers."""
    _register_zones(engine)
    _register_dungeons(engine)
    _register_secret_chambers(engine)


def _register_zones(engine: ZoneEngine) -> None:
    # 1. Sanctuary: Outcast Encampment (Bến Lưu Đày)
    engine.add_zone(
        ZoneDefinition(
            zone_id="zone_boundless_sanctuary",
            name="Doanh Trại Bến Lưu Đày",
            zone_type=ZoneType.SANCTUARY,
            environment=ZoneEnvironment.NORMAL,
            min_level=1,
            max_players=5000,
            bounds_width=800.0,
            bounds_height=800.0,
            default_spawn_x=0.0,
            default_spawn_y=0.0,
            respawn_zone_id="zone_boundless_sanctuary",
            respawn_x=0.0,
            respawn_y=0.0,
            waypoints={
                "wp_sanctuary_central": Waypoint(
                    waypoint_id="wp_sanctuary_central",
                    name="Trụ Đá Thần Hành: Bến Lưu Đày",
                    zone_id="zone_boundless_sanctuary",
                    x=0.0,
                    y=0.0,
                    is_unlocked_by_default=True,
                )
            },
            portals={
                "portal_sanctuary_to_tang_kiem": ZonePortal(
                    portal_id="portal_sanctuary_to_tang_kiem",
                    name="Cổng Tây: Đến Bờ Đá Tàn Xương",
                    source_zone_id="zone_boundless_sanctuary",
                    source_x=-380.0,
                    source_y=0.0,
                    target_zone_id="zone_tang_kiem_nhai",
                    target_x=50.0,
                    target_y=50.0,
                    min_level=1,
                ),
                "portal_sanctuary_to_ancient_sword": ZonePortal(
                    portal_id="portal_sanctuary_to_ancient_sword",
                    name="Cổng Bắc: Đến Đầm Lầy Thối Rữa",
                    source_zone_id="zone_boundless_sanctuary",
                    source_x=0.0,
                    source_y=380.0,
                    target_zone_id="zone_ancient_sword_barrow",
                    target_x=100.0,
                    target_y=100.0,
                    min_level=8,
                ),
                "portal_sanctuary_to_sandstorm": ZonePortal(
                    portal_id="portal_sanctuary_to_sandstorm",
                    name="Cổng Nam: Đến Sa Cốt Hoang Mạc",
                    source_zone_id="zone_boundless_sanctuary",
                    source_x=0.0,
                    source_y=-380.0,
                    target_zone_id="zone_boundless_sandstorm",
                    target_x=150.0,
                    target_y=150.0,
                    min_level=20,
                ),
                "portal_sanctuary_to_hideout": ZonePortal(
                    portal_id="portal_sanctuary_to_hideout",
                    name="Lối Vào: Tiên Phủ Động Thiên",
                    source_zone_id="zone_boundless_sanctuary",
                    source_x=380.0,
                    source_y=0.0,
                    target_zone_id="zone_player_hideout",
                    target_x=0.0,
                    target_y=0.0,
                    min_level=1,
                ),
            },
            npc_ids=[
                "npc_bach_hieu_sinh",
                "npc_van_gioi_thuong_nhan",
                "npc_thiet_tuong_au_da_tu",
                "npc_chan_vo_truyen_thua",
            ],
        )
    )

    # 1b. Sanctuary: Player Hideout (Tiên Phủ Động Thiên)
    engine.add_zone(
        ZoneDefinition(
            zone_id="zone_player_hideout",
            name="Tiên Phủ Động Thiên (Hideout)",
            zone_type=ZoneType.SANCTUARY,
            environment=ZoneEnvironment.NORMAL,
            min_level=1,
            max_players=5000,
            bounds_width=800.0,
            bounds_height=800.0,
            default_spawn_x=0.0,
            default_spawn_y=0.0,
            respawn_zone_id="zone_player_hideout",
            respawn_x=0.0,
            respawn_y=0.0,
            max_level=100,
            waypoints={
                "wp_hideout_central": Waypoint(
                    waypoint_id="wp_hideout_central",
                    name="Trụ Đá Thần Hành: Tiên Phủ Động Thiên",
                    zone_id="zone_player_hideout",
                    x=0.0,
                    y=0.0,
                    is_unlocked_by_default=True,
                )
            },
            portals={
                "portal_hideout_to_sanctuary": ZonePortal(
                    portal_id="portal_hideout_to_sanctuary",
                    name="Lối Ra: Doanh Trại Bến Lưu Đày",
                    source_zone_id="zone_player_hideout",
                    source_x=0.0,
                    source_y=-350.0,
                    target_zone_id="zone_boundless_sanctuary",
                    target_x=360.0,
                    target_y=0.0,
                    min_level=1,
                )
            },
            npc_ids=[],
        )
    )

    # 2. Bone Strand (Bờ Đá Tàn Xương)
    engine.add_zone(
        ZoneDefinition(
            zone_id="zone_tang_kiem_nhai",
            name="Bờ Đá Tàn Xương",
            zone_type=ZoneType.OPEN_WORLD,
            environment=ZoneEnvironment.NORMAL,
            min_level=1,
            max_players=3000,
            bounds_width=2000.0,
            bounds_height=2000.0,
            default_spawn_x=50.0,
            default_spawn_y=50.0,
            respawn_zone_id="zone_boundless_sanctuary",
            respawn_x=0.0,
            respawn_y=0.0,
            waypoints={
                "wp_tang_kiem_cliff": Waypoint(
                    waypoint_id="wp_tang_kiem_cliff",
                    name="Trụ Xương Thần Hành: Bờ Đá Tàn Xương",
                    zone_id="zone_tang_kiem_nhai",
                    x=150.0,
                    y=150.0,
                )
            },
            portals={
                "portal_tang_kiem_to_sanctuary": ZonePortal(
                    portal_id="portal_tang_kiem_to_sanctuary",
                    name="Lối Về: Bến Lưu Đày",
                    source_zone_id="zone_tang_kiem_nhai",
                    source_x=50.0,
                    source_y=20.0,
                    target_zone_id="zone_boundless_sanctuary",
                    target_x=-360.0,
                    target_y=0.0,
                    min_level=1,
                ),
                "portal_tang_kiem_to_ancient_sword": ZonePortal(
                    portal_id="portal_tang_kiem_to_ancient_sword",
                    name="Lối Mòn: Vào Đầm Lầy Thối Rữa",
                    source_zone_id="zone_tang_kiem_nhai",
                    source_x=450.0,
                    source_y=450.0,
                    target_zone_id="zone_ancient_sword_barrow",
                    target_x=100.0,
                    target_y=100.0,
                    min_level=8,
                ),
            },
            npc_ids=[
                "npc_doc_co_tan_kiem",
                "npc_tieu_dau_lao_ma",
            ],
        )
    )

    # 3. Putrid Fens (Đầm Lầy Thối Rữa)
    engine.add_zone(
        ZoneDefinition(
            zone_id="zone_ancient_sword_barrow",
            name="Đầm Lầy Thối Rữa",
            zone_type=ZoneType.OPEN_WORLD,
            environment=ZoneEnvironment.MIASMA_TOXIC,
            min_level=8,
            max_players=2000,
            bounds_width=2400.0,
            bounds_height=2400.0,
            default_spawn_x=100.0,
            default_spawn_y=100.0,
            respawn_zone_id="zone_boundless_sanctuary",
            respawn_x=0.0,
            respawn_y=0.0,
            waypoints={
                "wp_ancient_sword_barrow": Waypoint(
                    waypoint_id="wp_ancient_sword_barrow",
                    name="Trụ Đá Thần Hành: Đầm Lầy Thối Rữa",
                    zone_id="zone_ancient_sword_barrow",
                    x=300.0,
                    y=300.0,
                )
            },
            portals={
                "portal_ancient_sword_to_tang_kiem": ZonePortal(
                    portal_id="portal_ancient_sword_to_tang_kiem",
                    name="Lối Cũ: Trở Lại Bờ Đá Tàn Xương",
                    source_zone_id="zone_ancient_sword_barrow",
                    source_x=80.0,
                    source_y=80.0,
                    target_zone_id="zone_tang_kiem_nhai",
                    target_x=430.0,
                    target_y=430.0,
                    min_level=1,
                ),
                "portal_ancient_sword_to_sandstorm": ZonePortal(
                    portal_id="portal_ancient_sword_to_sandstorm",
                    name="Lối Băng Gió: Vào Sa Cốt Hoang Mạc",
                    source_zone_id="zone_ancient_sword_barrow",
                    source_x=550.0,
                    source_y=550.0,
                    target_zone_id="zone_boundless_sandstorm",
                    target_x=150.0,
                    target_y=150.0,
                    min_level=20,
                ),
            },
        )
    )

    # 4. Bone Wastes (Sa Cốt Hoang Mạc)
    engine.add_zone(
        ZoneDefinition(
            zone_id="zone_boundless_sandstorm",
            name="Sa Cốt Hoang Mạc",
            zone_type=ZoneType.OPEN_WORLD,
            environment=ZoneEnvironment.SANDSTORM,
            min_level=20,
            max_players=2000,
            bounds_width=3000.0,
            bounds_height=3000.0,
            default_spawn_x=150.0,
            default_spawn_y=150.0,
            respawn_zone_id="zone_boundless_sanctuary",
            respawn_x=0.0,
            respawn_y=0.0,
            waypoints={
                "wp_sandstorm_oasis": Waypoint(
                    waypoint_id="wp_sandstorm_oasis",
                    name="Trụ Cốt Thần Hành: Ốc Đảo Sa Cốt",
                    zone_id="zone_boundless_sandstorm",
                    x=450.0,
                    y=450.0,
                )
            },
            portals={
                "portal_sandstorm_to_blood_scale": ZonePortal(
                    portal_id="portal_sandstorm_to_blood_scale",
                    name="Lối Băng Qua: Đến Phế Tích Xẻ Thịt",
                    source_zone_id="zone_boundless_sandstorm",
                    source_x=700.0,
                    source_y=700.0,
                    target_zone_id="zone_blood_scale_ruins",
                    target_x=200.0,
                    target_y=200.0,
                    min_level=30,
                )
            },
            npc_ids=[
                "npc_sa_mac_du_than",
            ],
        )
    )

    # 5. Slaughter Ruins (Phế Tích Xẻ Thịt)
    engine.add_zone(
        ZoneDefinition(
            zone_id="zone_blood_scale_ruins",
            name="Phế Tích Xẻ Thịt",
            zone_type=ZoneType.OPEN_WORLD,
            environment=ZoneEnvironment.VOID_CORRUPTION,
            min_level=30,
            max_players=2000,
            bounds_width=3200.0,
            bounds_height=3200.0,
            default_spawn_x=200.0,
            default_spawn_y=200.0,
            respawn_zone_id="zone_boundless_sanctuary",
            respawn_x=0.0,
            respawn_y=0.0,
            waypoints={
                "wp_blood_scale_entrance": Waypoint(
                    waypoint_id="wp_blood_scale_entrance",
                    name="Trụ Cốt Thần Hành: Tiền Đồn Phế Tích Xẻ Thịt",
                    zone_id="zone_blood_scale_ruins",
                    x=200.0,
                    y=200.0,
                )
            },
            portals={
                "portal_blood_scale_to_five_elements": ZonePortal(
                    portal_id="portal_blood_scale_to_five_elements",
                    name="Lối Rách Đá: Đến Tế Đàn Man Hoang",
                    source_zone_id="zone_blood_scale_ruins",
                    source_x=750.0,
                    source_y=750.0,
                    target_zone_id="zone_five_elements_altar",
                    target_x=250.0,
                    target_y=250.0,
                    min_level=40,
                )
            },
        )
    )

    # 6. Primal Altar (Tế Đàn Man Hoang)
    engine.add_zone(
        ZoneDefinition(
            zone_id="zone_five_elements_altar",
            name="Tế Đàn Man Hoang",
            zone_type=ZoneType.OPEN_WORLD,
            environment=ZoneEnvironment.NORMAL,
            min_level=40,
            max_players=2000,
            bounds_width=3600.0,
            bounds_height=3600.0,
            default_spawn_x=250.0,
            default_spawn_y=250.0,
            respawn_zone_id="zone_boundless_sanctuary",
            respawn_x=0.0,
            respawn_y=0.0,
            waypoints={
                "wp_five_elements_core": Waypoint(
                    waypoint_id="wp_five_elements_core",
                    name="Trụ Đá Thần Hành: Tế Đàn Man Hoang",
                    zone_id="zone_five_elements_altar",
                    x=500.0,
                    y=500.0,
                )
            },
            portals={
                "portal_five_elements_to_ice_pond": ZonePortal(
                    portal_id="portal_five_elements_to_ice_pond",
                    name="Lối Hang Lạnh: Đến Vực Đầm Băng Độc",
                    source_zone_id="zone_five_elements_altar",
                    source_x=850.0,
                    source_y=850.0,
                    target_zone_id="zone_abyssal_ice_pond",
                    target_x=300.0,
                    target_y=300.0,
                    min_level=50,
                )
            },
        )
    )

    # 7. Abyssal Bile Mire (Vực Đầm Băng Độc)
    engine.add_zone(
        ZoneDefinition(
            zone_id="zone_abyssal_ice_pond",
            name="Vực Đầm Băng Độc",
            zone_type=ZoneType.OPEN_WORLD,
            environment=ZoneEnvironment.FREEZING_CHILL,
            min_level=50,
            max_players=2000,
            bounds_width=4000.0,
            bounds_height=4000.0,
            default_spawn_x=300.0,
            default_spawn_y=300.0,
            respawn_zone_id="zone_boundless_sanctuary",
            respawn_x=0.0,
            respawn_y=0.0,
            waypoints={
                "wp_abyssal_ice_shore": Waypoint(
                    waypoint_id="wp_abyssal_ice_shore",
                    name="Trụ Băng Thần Hành: Bờ Vực Đầm Băng Độc",
                    zone_id="zone_abyssal_ice_pond",
                    x=600.0,
                    y=600.0,
                )
            },
            portals={
                "portal_ice_pond_to_infinite_rift": ZonePortal(
                    portal_id="portal_ice_pond_to_infinite_rift",
                    name="Khe Nứt Đáy Vực: Đến Vực Đói Nuốt Chửng",
                    source_zone_id="zone_abyssal_ice_pond",
                    source_x=950.0,
                    source_y=950.0,
                    target_zone_id="zone_infinite_blood_rift",
                    target_x=350.0,
                    target_y=350.0,
                    min_level=60,
                )
            },
        )
    )

    # 8. Gorge of the Starved (Vực Đói Nuốt Chửng)
    engine.add_zone(
        ZoneDefinition(
            zone_id="zone_infinite_blood_rift",
            name="Vực Đói Nuốt Chửng",
            zone_type=ZoneType.OPEN_WORLD,
            environment=ZoneEnvironment.FREEZING_CHILL,
            min_level=60,
            max_players=2000,
            bounds_width=4400.0,
            bounds_height=4400.0,
            default_spawn_x=350.0,
            default_spawn_y=350.0,
            respawn_zone_id="zone_boundless_sanctuary",
            respawn_x=0.0,
            respawn_y=0.0,
            waypoints={
                "wp_infinite_blood_rift": Waypoint(
                    waypoint_id="wp_infinite_blood_rift",
                    name="Trụ Xương Thần Hành: Vực Đói Nuốt Chửng",
                    zone_id="zone_infinite_blood_rift",
                    x=700.0,
                    y=700.0,
                )
            },
            portals={
                "portal_infinite_rift_to_lava_cavern": ZonePortal(
                    portal_id="portal_infinite_rift_to_lava_cavern",
                    name="Hầm Nham Thạch: Đến Miệng Lửa Nung Máu",
                    source_zone_id="zone_infinite_blood_rift",
                    source_x=1050.0,
                    source_y=1050.0,
                    target_zone_id="zone_purgatory_lava_cavern",
                    target_x=400.0,
                    target_y=400.0,
                    min_level=70,
                )
            },
        )
    )

    # 9. Bloodforge Caldera (Miệng Lửa Nung Máu)
    engine.add_zone(
        ZoneDefinition(
            zone_id="zone_purgatory_lava_cavern",
            name="Miệng Lửa Nung Máu",
            zone_type=ZoneType.OPEN_WORLD,
            environment=ZoneEnvironment.SCORCHING_HEAT,
            min_level=70,
            max_players=2000,
            bounds_width=4800.0,
            bounds_height=4800.0,
            default_spawn_x=400.0,
            default_spawn_y=400.0,
            respawn_zone_id="zone_boundless_sanctuary",
            respawn_x=0.0,
            respawn_y=0.0,
            waypoints={
                "wp_lava_cavern_crater": Waypoint(
                    waypoint_id="wp_lava_cavern_crater",
                    name="Trụ Nham Thần Hành: Miệng Lửa Nung Máu",
                    zone_id="zone_purgatory_lava_cavern",
                    x=800.0,
                    y=800.0,
                )
            },
            portals={
                "portal_lava_to_celestial": ZonePortal(
                    portal_id="portal_lava_to_celestial",
                    name="Bậc Đá Huyết Lạc: Lên Bệ Thờ Quỷ Đoạt Mệnh",
                    source_zone_id="zone_purgatory_lava_cavern",
                    source_x=1150.0,
                    source_y=1150.0,
                    target_zone_id="zone_boundless_celestial_palace",
                    target_x=500.0,
                    target_y=500.0,
                    min_level=85,
                )
            },
        )
    )

    # 10. Apex of Slaughter (Bệ Thờ Quỷ Đoạt Mệnh)
    engine.add_zone(
        ZoneDefinition(
            zone_id="zone_boundless_celestial_palace",
            name="Bệ Thờ Quỷ Đoạt Mệnh",
            zone_type=ZoneType.OPEN_WORLD,
            environment=ZoneEnvironment.VOID_CORRUPTION,
            min_level=85,
            max_players=2000,
            bounds_width=5000.0,
            bounds_height=5000.0,
            default_spawn_x=500.0,
            default_spawn_y=500.0,
            respawn_zone_id="zone_boundless_sanctuary",
            respawn_x=0.0,
            respawn_y=0.0,
            waypoints={
                "wp_celestial_peak": Waypoint(
                    waypoint_id="wp_celestial_peak",
                    name="Trụ Cổ Thần Hành: Bệ Thờ Quỷ Đoạt Mệnh",
                    zone_id="zone_boundless_celestial_palace",
                    x=1000.0,
                    y=1000.0,
                )
            },
            portals={
                "portal_celestial_to_sanctuary": ZonePortal(
                    portal_id="portal_celestial_to_sanctuary",
                    name="Cửa Hầm Lưu Đày: Trở Về Bến Lưu Đày",
                    source_zone_id="zone_boundless_celestial_palace",
                    source_x=500.0,
                    source_y=450.0,
                    target_zone_id="zone_boundless_sanctuary",
                    target_x=0.0,
                    target_y=0.0,
                    min_level=1,
                )
            },
        )
    )


def _register_dungeons(engine: ZoneEngine) -> None:
    engine.dungeon_templates["inst_phong_ma_co_tran"] = DungeonTemplate(
        template_id="inst_phong_ma_co_tran",
        name="Hầm Ngục Phong Thú (50 Tầng)",
        min_level=30,
        max_layers=50,
        max_party_size=4,
        time_limit_sec=1800,
        revive_lives=3,
        required_quest_id="quest_norm_05_khai_mo_van_gioi_cac",
        boss_monster_id="boss_world_abyssal_dragon_king",
    )

    engine.dungeon_templates["inst_bi_canh_hu_khong"] = DungeonTemplate(
        template_id="inst_bi_canh_hu_khong",
        name="Cõi Tuyệt Địa Hư Không (100 Tầng)",
        min_level=60,
        max_layers=100,
        max_party_size=4,
        time_limit_sec=3600,
        revive_lives=1,
        boss_monster_id="boss_flame_demon_lord",
    )

    engine.dungeon_templates["inst_van_gioi_thi_luyen"] = DungeonTemplate(
        template_id="inst_van_gioi_thi_luyen",
        name="Đấu Trường Sinh Tử Man Tộc (3 Vòng)",
        min_level=15,
        max_layers=3,
        max_party_size=2,
        time_limit_sec=600,
        revive_lives=3,
    )


def _register_secret_chambers(engine: ZoneEngine) -> None:
    engine.secret_chamber_templates["secret_huyen_anh_to_su"] = SecretChamberTemplate(
        template_id="secret_huyen_anh_to_su",
        name="Bí Thất Thân Pháp Xà Ảnh",
        parent_zone_id="zone_blood_scale_ruins",
        target_objective_id="loc_secret_phantom_shrine",
        lifespan_sec=600,
        description="Lối vào bí thất khắc họa bộ pháp Xà Ảnh xuất hiện trong khe nứt đá sau khi luồn lách né đòn thập tử nhất sinh.",
    )

    engine.secret_chamber_templates["secret_tan_bi_than_tuong"] = SecretChamberTemplate(
        template_id="secret_tan_bi_than_tuong",
        name="Hầm Mộ Chiến Binh Man Tộc",
        parent_zone_id="zone_boundless_sandstorm",
        target_objective_id="action_decipher_ancient_stele",
        lifespan_sec=900,
        description="Hầm mộ đá cổ chôn vùi dưới bia xương lộ diện sau cuồng phong bão cát càn quét.",
    )

    engine.secret_chamber_templates["secret_ngu_hanh_tran_nhan"] = SecretChamberTemplate(
        template_id="secret_ngu_hanh_tran_nhan",
        name="Mắt Trận Thú Tổ Man Hoang",
        parent_zone_id="zone_five_elements_altar",
        target_objective_id="loc_five_elements_altar",
        lifespan_sec=900,
        description="Cửa hang ngầm mở ra khi cả năm cột tế khắc hình thú tổ được đánh thức đồng điệu.",
    )

    engine.secret_chamber_templates["secret_tang_kiem_kiem_chung"] = SecretChamberTemplate(
        template_id="secret_tang_kiem_kiem_chung",
        name="Hốc Đá Rửa Đao Oán Huyết",
        parent_zone_id="zone_tang_kiem_nhai",
        target_objective_id="action_cleanse_rusted_blade",
        lifespan_sec=900,
        description="Bí đạo ngầm rỉ máu trong vách đá dẫn đến nơi chôn cất những lưỡi đao sắt rỉ nhiễm oán khí man dại.",
    )
