"""
Canonical Map Style Catalog for FreeExile.
Defines all 30 Dark Fantasy Cổ Võ Hoang Vực biomes across 6 thematic categories,
providing bidirectional legacy biome mappings and lookup dictionaries.
"""

from __future__ import annotations
from typing import Dict, List, Optional, Tuple

from server.world.map_style_types import (
    MapStyleDefinition,
    MapStylePalette,
    MapStyleLighting,
    MapStyleHazard,
    MapStyleTileMapping,
    MapStylePropDefinition,
)

# Raw specification tuples:
# (style_id, biome_code, name_vi, name_en, theme_cat, theme_cat_vi,
#  (floor, wall, path, liquid, ambient), fog_density, (slow_factor, dps),
#  legacy_alias, monster_family, props_tuple)
_RAW_STYLES_DATA: Tuple[Tuple, ...] = (
    # Theme I: Hoang Dã Dã Ngoại (Primal Wilderness & Wastelands)
    (
        "STY_01_HOANG_MANG_CO_LO", 6, "Hoang Mãng Cổ Lộ", "Ancient Savage Trail",
        "HOANG_DA_DA_NGOAI", "Hoang Dã Dã Ngoại",
        ("#3d3730", "#262320", "#584e42", "#2a2d24", "#2a2620"), 0.25, (1.0, 0),
        None, "feral_scavengers_and_wild_hounds",
        (
            ("prop_broken_beast_bones", "Xương thú hoang gãy vụn", "Broken Beast Bones", "FLOOR_EDGE", 0.35),
            ("prop_ragged_flag_pole", "Cọc gỗ cắm cờ rách", "Ragged Flag Pole", "WALL_ADJACENT", 0.20),
            ("prop_chipped_boulder", "Đá tảng sứt mẻ", "Chipped Boulder", "ANY_FLOOR", 0.25),
        ),
    ),
    (
        "STY_02_HUYET_SAT_LAM", 3, "Huyết Sát Lâm", "Bloodthorn Thicket",
        "HOANG_DA_DA_NGOAI", "Hoang Dã Dã Ngoại",
        ("#3a1d20", "#241012", "#54282b", "#631218", "#3b0d11"), 0.40, (1.2, 5),
        "CRIMSON_BLOOD_FOREST", "feral_hounds_and_thorn_horrors",
        (
            ("prop_bloodthorn_spikes", "Gai huyết thụ tua tủa", "Bloodthorn Spikes", "WALL_ADJACENT", 0.40),
            ("prop_impaled_skulls", "Sọ thú ghim cành cây", "Impaled Beast Skulls", "FLOOR_EDGE", 0.25),
            ("prop_broken_sacrificial_pot", "Vò gốm hiến tế vỡ", "Broken Sacrificial Pot", "DEAD_END", 0.15),
        ),
    ),
    (
        "STY_03_BO_DA_TAN_XUONG", 7, "Bờ Đá Tàn Xương", "Shattered Bone Strand",
        "HOANG_DA_DA_NGOAI", "Hoang Dã Dã Ngoại",
        ("#323538", "#1f2124", "#464b50", "#0e1d28", "#1c2630"), 0.35, (1.0, 0),
        None, "strand_scavengers_and_drowned_corpses",
        (
            ("prop_shipwreck_debris", "Xác tàu đắm vỡ vụn", "Shipwreck Debris", "WALL_ADJACENT", 0.30),
            ("prop_rusted_anchor_stake", "Cọc neo sắt rỉ", "Rusted Anchor Stake", "PATH_SIDE", 0.25),
            ("prop_driftwood_remnants", "Mảnh gỗ dạt bờ", "Driftwood Remnants", "FLOOR_EDGE", 0.35),
        ),
    ),
    (
        "STY_04_HOANG_GIOI_CUONG_THU", 8, "Hoang Giới Cuồng Thú", "Feral Beast Steppes",
        "HOANG_DA_DA_NGOAI", "Hoang Dã Dã Ngoại",
        ("#383325", "#282218", "#4f4732", "#2b281a", "#2d271e"), 0.20, (1.1, 0),
        None, "feral_boars_and_horned_beasts",
        (
            ("prop_rusted_beast_trap", "Bẫy gập răng thú rỉ sét", "Rusted Beast Trap", "ANY_FLOOR", 0.25),
            ("prop_giant_hunter_skull", "Khung sọ thú săn khổng lồ", "Giant Hunter Skull", "DEAD_END", 0.20),
            ("prop_leather_stretched_pole", "Cọc gỗ căng da thú", "Leather Stretched Pole", "WALL_ADJACENT", 0.30),
        ),
    ),
    (
        "STY_05_KHAI_XUONG_CO_CAN", 9, "Khai Xương Cổ Cạn", "Dried Skeletal Basin",
        "HOANG_DA_DA_NGOAI", "Hoang Dã Dã Ngoại",
        ("#45413b", "#2d2a26", "#5e574f", "#4a452a", "#383228"), 0.15, (1.0, 0),
        None, "desiccated_crawlers_and_bone_vultures",
        (
            ("prop_ancient_fish_skeleton", "Khung xương cá cổ đại lộ thiên", "Ancient Fish Skeleton", "FLOOR_EDGE", 0.35),
            ("prop_charred_dry_tree", "Cây khô cháy xém", "Charred Dry Tree", "WALL_ADJACENT", 0.25),
            ("prop_collapsed_ground_hollow", "Hốc đất sạt lở", "Collapsed Ground Hollow", "ANY_FLOOR", 0.20),
        ),
    ),

    # Theme II: Đầm Lầy Độc Chướng (Venomous Miasma Swamps)
    (
        "STY_06_BAI_THA_MA_NGAP_MAN", 2, "Bãi Tha Ma Ngập Mặn", "Savage Mangrove Swamp",
        "DAM_LAY_DOC_CHUONG", "Đầm Lầy Độc Chướng",
        ("#243324", "#152015", "#3d4d33", "#132415", "#1a2e1d"), 0.45, (1.5, 10),
        "SAVAGE_MANGROVE_SWAMP", "swamp_crawlers_and_blood_leeches",
        (
            ("prop_mangrove_roots_bones", "Rễ đước chằng chịt quấn xương", "Mangrove Roots Wrapping Bones", "WALL_ADJACENT", 0.45),
            ("prop_submerged_iron_cage", "Lồng sắt dìm tù nhân", "Submerged Iron Cage", "DEAD_END", 0.15),
            ("prop_rotting_driftwood", "Xác mộc mục rữa", "Rotting Driftwood", "FLOOR_EDGE", 0.30),
        ),
    ),
    (
        "STY_07_DAM_LAY_THOI_RUA", 10, "Đầm Lầy Thối Rữa", "Putrid Rotting Fens",
        "DAM_LAY_DOC_CHUONG", "Đầm Lầy Độc Chướng",
        ("#1f2e1b", "#141f11", "#34472c", "#0f170e", "#162413"), 0.50, (1.6, 15),
        None, "putrid_corpses_and_swamp_leeches",
        (
            ("prop_toxic_biolum_mushrooms", "Cụm nấm độc phát quang xỉn", "Toxic Bioluminescent Mushrooms", "WALL_ADJACENT", 0.35),
            ("prop_mossy_moldy_stake", "Cọc mốc rêu mục", "Mossy Moldy Stake", "PATH_SIDE", 0.25),
            ("prop_broken_mud_chest", "Hòm ngâm bùn nứt vỡ", "Broken Mud Chest", "DEAD_END", 0.15),
        ),
    ),
    (
        "STY_08_VUC_DAM_BANG_DOC", 11, "Vực Đầm Băng Độc", "Abyssal Bile Mire",
        "DAM_LAY_DOC_CHUONG", "Đầm Lầy Độc Chướng",
        ("#202e2b", "#14201e", "#354a45", "#0e211e", "#182926"), 0.38, (1.4, 8),
        None, "bile_serpents_and_frost_abominations",
        (
            ("prop_frozen_poison_crystals", "Tinh thể độc đóng băng", "Frozen Poison Crystals", "WALL_ADJACENT", 0.30),
            ("prop_frozen_beast_carcass", "Tảng băng ướp xác dã thú", "Frozen Beast Carcass", "DEAD_END", 0.25),
            ("prop_jade_frost_spikes", "Gai băng xanh ngọc", "Jade Frost Spikes", "FLOOR_EDGE", 0.35),
        ),
    ),
    (
        "STY_09_HAC_THUY_MIEU_TRAP", 12, "Hắc Thủy Miểu Trạch", "Blackwater Corpse Marsh",
        "DAM_LAY_DOC_CHUONG", "Đầm Lầy Độc Chướng",
        ("#181b18", "#101210", "#2a2f2a", "#080a08", "#121412"), 0.42, (1.5, 12),
        None, "blackwater_drowned_and_scourge_crows",
        (
            ("prop_sunken_tombstone", "Bia mộ ngập nửa trong bùn đen", "Sunken Mud Tombstone", "FLOOR_EDGE", 0.35),
            ("prop_willowisp_bone_lantern", "Đèn lồng xương ma trơi", "Wisp Bone Lantern", "WALL_ADJACENT", 0.20),
            ("prop_wrecked_coracle", "Thuyền nan đắm", "Wrecked Coracle", "PATH_SIDE", 0.20),
        ),
    ),
    (
        "STY_10_DOC_CHIEU_MA_HO", 13, "Độc Chiếu Ma Hồ", "Venom Fog Ghost Lake",
        "DAM_LAY_DOC_CHUONG", "Đầm Lầy Độc Chướng",
        ("#282c22", "#1a1d16", "#3e4536", "#163328", "#1c2b20"), 0.48, (1.3, 10),
        None, "venom_serpents_and_marsh_abominations",
        (
            ("prop_leaking_venom_jar", "Chum ủ nọc độc vỡ rỉ dịch", "Leaking Venom Jar", "DEAD_END", 0.30),
            ("prop_chained_exile_post", "Cọc gỗ buộc xích tù đày", "Chained Exile Post", "WALL_ADJACENT", 0.25),
            ("prop_oozing_vines", "Dây leo tiết mủ", "Oozing Vines", "FLOOR_EDGE", 0.35),
        ),
    ),

    # Theme III: Hẻm Núi Cốt Mạc (Bleached Canyons & Arid Deserts)
    (
        "STY_11_HEM_NUI_XUONG_TRANG", 1, "Hẻm Núi Xương Trắng", "Bleached Bone Canyon",
        "HEM_NUI_COT_MAC", "Hẻm Núi Cốt Mạc",
        ("#3a3630", "#272522", "#544c42", "#2e2b26", "#2a2825"), 0.22, (1.0, 0),
        "BLEACHED_BONE_CANYON", "bone_golems_and_vulture_cultists",
        (
            ("prop_colossal_bone_bridge", "Khung xương khổng lồ bắc ngang hẻm", "Colossal Bone Bridge", "WALL_ADJACENT", 0.35),
            ("prop_barbarian_skull_stake", "Cọc sọ man tộc cắm đá", "Barbarian Skull Stake", "PATH_SIDE", 0.25),
            ("prop_scattered_bone_shards", "Mảnh xương vụn rải rác", "Scattered Bone Shards", "ANY_FLOOR", 0.40),
        ),
    ),
    (
        "STY_12_SA_COT_HOANG_MAC", 14, "Sa Cốt Hoang Mạc", "Desolate Bone Desert",
        "HEM_NUI_COT_MAC", "Hẻm Núi Cốt Mạc",
        ("#4d4232", "#332b20", "#665743", "#2b241b", "#3d3427"), 0.35, (1.2, 0),
        None, "dune_bone_scorpions_and_sand_marauders",
        (
            ("prop_mammoth_skull_sand", "Sọ voi ma mút cắm sâu trong cát", "Mammoth Skull in Sand", "FLOOR_EDGE", 0.30),
            ("prop_ragged_trail_marker", "Cột mốc gỗ rách bọc da", "Ragged Trail Marker", "PATH_SIDE", 0.25),
            ("prop_buried_iron_armor", "Giáp sắt vùi lấp", "Buried Iron Armor", "ANY_FLOOR", 0.20),
        ),
    ),
    (
        "STY_13_CON_CAT_MA_QUY", 15, "Cồn Cát Ma Quỷ", "Ghost Dune Wastes",
        "HEM_NUI_COT_MAC", "Hẻm Núi Cốt Mạc",
        ("#262428", "#18171a", "#3b383e", "#121114", "#1c1a20"), 0.25, (1.0, 0),
        None, "ghost_dune_wraiths_and_shadow_stalkers",
        (
            ("prop_headless_stone_statue", "Tượng đá vỡ không đầu", "Headless Stone Statue", "DEAD_END", 0.25),
            ("prop_black_rusted_iron_stake", "Cọc xích tù đày gỉ đen", "Black Rusted Iron Stake", "WALL_ADJACENT", 0.30),
            ("prop_black_sand_sinkhole", "Hố sụt cát đen", "Black Sand Sinkhole", "ANY_FLOOR", 0.20),
        ),
    ),
    (
        "STY_14_VUC_DOI_NUOT_CHUNG", 16, "Vực Đói Nuốt Chửng", "Gorge of the Starved",
        "HEM_NUI_COT_MAC", "Hẻm Núi Cốt Mạc",
        ("#362e2a", "#241e1b", "#4e433d", "#211513", "#28221f"), 0.30, (1.1, 0),
        None, "starved_ghouls_and_abyssal_bats",
        (
            ("prop_broken_bridge_pylon", "Mấu gỗ cầu treo đứt gãy", "Broken Bridge Pylon", "WALL_ADJACENT", 0.30),
            ("prop_crevice_skeleton", "Xương người mắc kẹt khe đá", "Crevice Skeleton", "FLOOR_EDGE", 0.35),
            ("prop_severed_climbing_rope", "Dây thừng leo núi đứt", "Severed Climbing Rope", "PATH_SIDE", 0.20),
        ),
    ),
    (
        "STY_15_QUY_PHONG_HAC_NHAI", 17, "Quỷ Phong Hắc Nhai", "Demon Gale Black Precipice",
        "HEM_NUI_COT_MAC", "Hẻm Núi Cốt Mạc",
        ("#22252a", "#15171b", "#353a42", "#1f1830", "#1e1c28"), 0.28, (1.2, 5),
        None, "demon_storm_raptors_and_wind_slayers",
        (
            ("prop_lightning_rod_spire", "Cọc thu lôi sắt rỉ ghim đỉnh đá", "Lightning Rod Spire", "DEAD_END", 0.25),
            ("prop_black_sacrificial_banner", "Cờ tế đen rách nát", "Black Sacrificial Banner", "WALL_ADJACENT", 0.35),
            ("prop_cracked_bronze_bell", "Chuông đồng sứt mẻ", "Cracked Bronze Bell", "PATH_SIDE", 0.20),
        ),
    ),

    # Theme IV: Hầm Mỏ Tà Quái (Corrupted Mines & Subterranean Depths)
    (
        "STY_16_MO_QUANG_LUU_DAY", 4, "Mỏ Quặng Lưu Đày", "Outcast Mine Shafts",
        "HAM_MO_TA_QUAI", "Hầm Mỏ Tà Quái",
        ("#282a30", "#18191d", "#404450", "#171a22", "#1f1d19"), 0.30, (1.0, 0),
        "OUTCAST_MINE_SHAFTS", "renegade_miners_and_chasm_spiders",
        (
            ("prop_overturned_ore_cart", "Xe goòng lật nghiêng đầy quặng", "Overturned Ore Cart", "WALL_ADJACENT", 0.35),
            ("prop_broken_rusted_pickaxe", "Cuốc chim gãy rỉ sét", "Broken Rusted Pickaxe", "ANY_FLOOR", 0.25),
            ("prop_cracked_support_beam", "Trụ gỗ chống hầm nứt toác", "Cracked Support Beam", "PATH_SIDE", 0.40),
        ),
    ),
    (
        "STY_17_DIA_DAO_HUYET_THACH", 18, "Địa Đạo Huyết Thạch", "Bloodstone Catacombs",
        "HAM_MO_TA_QUAI", "Hầm Mỏ Tà Quái",
        ("#351f24", "#231216", "#522d35", "#380e15", "#2d1419"), 0.25, (1.1, 5),
        None, "bloodstone_golems_and_chittering_beetles",
        (
            ("prop_bloodstone_crystal_cluster", "Khối tinh thể huyết thạch nhô lên", "Bloodstone Crystal Cluster", "WALL_ADJACENT", 0.35),
            ("prop_shattered_ore_chest", "Rương chứa quặng vỡ nát", "Shattered Ore Chest", "DEAD_END", 0.20),
            ("prop_broken_stone_lever", "Đòn bẩy đá gãy", "Broken Stone Lever", "ANY_FLOOR", 0.25),
        ),
    ),
    (
        "STY_18_MIENG_LUA_NUNG_MAU", 19, "Miệng Lửa Nung Máu", "Bloodforge Caldera",
        "HAM_MO_TA_QUAI", "Hầm Mỏ Tà Quái",
        ("#381c1c", "#240f0f", "#542a2a", "#7f1d1d", "#3b1111"), 0.20, (1.2, 15),
        None, "magma_behemoths_and_bloodforge_smiths",
        (
            ("prop_giant_blood_forge", "Bễ rèn man tộc khổng lồ rỉ máu", "Giant Blood Forge", "DEAD_END", 0.25),
            ("prop_split_steel_anvil", "Đe thép nung nứt đôi", "Split Steel Anvil", "WALL_ADJACENT", 0.25),
            ("prop_redhot_hanging_chains", "Xích sắt nung đỏ treo trần", "Red-hot Hanging Chains", "PATH_SIDE", 0.35),
        ),
    ),
    (
        "STY_19_HAM_LUA_LUYEN_NGUC", 20, "Hầm Lửa Luyện Ngục", "Purgatory Lava Chasm",
        "HAM_MO_TA_QUAI", "Hầm Mỏ Tà Quái",
        ("#2d2222", "#1c1313", "#453232", "#991b1b", "#331515"), 0.28, (1.3, 20),
        None, "purgatory_fiends_and_lava_crawlers",
        (
            ("prop_burning_iron_stake", "Cọc sắt thiêu sống phạm nhân", "Burning Iron Stake", "WALL_ADJACENT", 0.30),
            ("prop_chipped_oil_cauldron", "Vạc dầu nung sứt mẻ", "Chipped Oil Cauldron", "DEAD_END", 0.20),
            ("prop_smoldering_coal_pile", "Than đá rực lửa âm ỉ", "Smoldering Coal Pile", "FLOOR_EDGE", 0.35),
        ),
    ),
    (
        "STY_20_VUC_THAM_XICH_THIET", 21, "Vực Thẳm Xích Thiết", "Rust Iron Deep Trench",
        "HAM_MO_TA_QUAI", "Hầm Mỏ Tà Quái",
        ("#3b2619", "#26170d", "#573924", "#24150b", "#281a11"), 0.32, (1.1, 0),
        None, "rust_automata_and_iron_scavengers",
        (
            ("prop_colossal_chains_pillar", "Xích sắt khổng lồ quấn trụ đá", "Colossal Chains Around Pillar", "WALL_ADJACENT", 0.40),
            ("prop_broken_machine_gear", "Bánh răng cơ khí gãy răng", "Broken Machine Gear", "ANY_FLOOR", 0.25),
            ("prop_rusted_iron_effigy", "Bù nhìn sắt rỉ mục", "Rusted Iron Effigy", "DEAD_END", 0.20),
        ),
    ),

    # Theme V: Thần Điện Phế Tích (Ancient Cursed Temples & Megaliths)
    (
        "STY_21_PHE_TICH_MA_THAN", 5, "Phế Tích Ma Thần", "Corrupted Fiend Ruins",
        "THAN_DIEN_PHE_TICH", "Thần Điện Phế Tích",
        ("#2a2035", "#1a1322", "#443455", "#1f0e2b", "#22112b"), 0.35, (1.0, 0),
        "CORRUPTED_FIEND_RUINS", "fiend_abominations_and_blood_priests",
        (
            ("prop_fiend_altar_split", "Bàn thờ ma thần vỡ đôi", "Split Fiend Altar", "DEAD_END", 0.30),
            ("prop_demon_face_stone_pillar", "Cột đá chạm khắc mặt quỷ đổ", "Fallen Demon Face Pillar", "WALL_ADJACENT", 0.35),
            ("prop_blackened_censer", "Lư hương đồng rỉ đen", "Blackened Bronze Censer", "PATH_SIDE", 0.25),
        ),
    ),
    (
        "STY_22_PHE_TICH_XE_THIT", 22, "Phế Tích Xẻ Thịt", "Slaughter Ruins of the Fallen",
        "THAN_DIEN_PHE_TICH", "Thần Điện Phế Tích",
        ("#332025", "#211317", "#4e2e36", "#3d0b13", "#291218"), 0.32, (1.2, 8),
        None, "slaughter_warlords_and_arena_butchers",
        (
            ("prop_meat_hook_rack", "Móc sắt treo xác tử tù", "Meat Hook Rack", "WALL_ADJACENT", 0.35),
            ("prop_bloody_iron_spikes", "Cọc gỗ đóng cọc sắt đẫm máu", "Bloody Iron Spikes", "PATH_SIDE", 0.30),
            ("prop_gladiator_iron_cage", "Lồng sắt giam giác đấu thủ", "Gladiator Iron Cage", "DEAD_END", 0.25),
        ),
    ),
    (
        "STY_23_TE_DAN_MAN_HOANG", 23, "Tế Đàn Man Hoang", "Savage Primal Megalith",
        "THAN_DIEN_PHE_TICH", "Thần Điện Phế Tích",
        ("#2e2b26", "#1e1c18", "#47423a", "#361214", "#26221c"), 0.26, (1.0, 0),
        None, "primal_cultists_and_totemic_shamans",
        (
            ("prop_totemic_megalith", "Trụ cự thạch khắc phù điêu thú tổ", "Totemic Megalith", "WALL_ADJACENT", 0.40),
            ("prop_sacrificial_bonfire", "Đống củi tế cháy bập bùng", "Sacrificial Bonfire", "PATH_SIDE", 0.25),
            ("prop_blood_basin", "Chậu đá đựng huyết tế", "Blood Basin", "DEAD_END", 0.20),
        ),
    ),
    (
        "STY_24_BE_THO_QUY_DOAT_MENH", 24, "Bệ Thờ Quỷ Đoạt Mệnh", "Apex of Slaughter Altar",
        "THAN_DIEN_PHE_TICH", "Thần Điện Phế Tích",
        ("#251b2a", "#18101c", "#3c2d43", "#1c0c24", "#201226"), 0.38, (1.1, 10),
        None, "apex_executioners_and_scourge_acolytes",
        (
            ("prop_cursed_monolith_altar", "Bệ thờ đá nguyên khối khắc tà ấn", "Cursed Monolith Altar", "DEAD_END", 0.30),
            ("prop_demon_fang_pillars", "Trụ đá nhọn hình răng quỷ", "Demon Fang Pillars", "WALL_ADJACENT", 0.35),
            ("prop_verdigris_tripod", "Đỉnh đồng ba chân rỉ xanh", "Verdigris Bronze Tripod", "PATH_SIDE", 0.20),
        ),
    ),
    (
        "STY_25_VAN_KIEP_MIEU_DIA", 25, "Vạn Kiếp Miếu Địa", "Crypt of Ten Thousand Woes",
        "THAN_DIEN_PHE_TICH", "Thần Điện Phế Tích",
        ("#28262a", "#1a181c", "#3f3c43", "#1b1920", "#1d1b22"), 0.40, (1.2, 5),
        None, "crypt_mummies_and_tomb_wraiths",
        (
            ("prop_ajar_stone_sarcophagus", "Quan tài đá nắp lệch lòi xương", "Ajar Stone Sarcophagus", "WALL_ADJACENT", 0.35),
            ("prop_broken_burial_urn", "Hũ sành ướp xác nứt vỡ", "Broken Burial Urn", "ANY_FLOOR", 0.30),
            ("prop_tallow_candle_stand", "Giá nến mỡ người cháy lụi", "Tallow Candle Stand", "PATH_SIDE", 0.20),
        ),
    ),

    # Theme VI: Hư Không Dị Biến (Abyssal Void & Nether Incursions)
    (
        "STY_26_COI_HU_KHONG_TUYET_DIA", 26, "Cõi Hư Không Tuyệt Địa", "The Abyssal Void Rift",
        "HU_KHONG_DI_BIEN", "Hư Không Dị Biến",
        ("#1b1528", "#100c1a", "#2f2545", "#080510", "#171026"), 0.45, (1.3, 12),
        None, "void_walkers_and_rift_scavengers",
        (
            ("prop_floating_void_crystal", "Tinh thể hư không lơ lửng xoay tròn", "Floating Void Crystal", "WALL_ADJACENT", 0.35),
            ("prop_black_meteor_shard", "Mảnh thiên thạch đen cắm đất", "Black Meteor Shard", "ANY_FLOOR", 0.30),
            ("prop_cracked_seal_pillar", "Trụ phong ấn rạn nứt phát quang", "Cracked Seal Pillar", "DEAD_END", 0.25),
        ),
    ),
    (
        "STY_27_VET_NUT_VO_HAN_HUYET_GIOI", 27, "Vết Nứt Vô Hạn Huyết Giới", "Infinite Crimson Breach",
        "HU_KHONG_DI_BIEN", "Hư Không Dị Biến",
        ("#38151c", "#240c11", "#56232d", "#6b0f1b", "#2e0d14"), 0.35, (1.2, 15),
        None, "crimson_flesh_horrors_and_scourge_larvae",
        (
            ("prop_pulsing_flesh_tumor", "Khối u thịt đập theo nhịp tim", "Pulsing Flesh Tumor", "WALL_ADJACENT", 0.40),
            ("prop_wall_staring_demon_eye", "Mắt quỷ mở thao láo trên vách", "Wall Staring Demon Eye", "DEAD_END", 0.25),
            ("prop_floor_fanged_maw", "Miệng răng lởm chởm trên nền đất", "Floor Fanged Maw", "ANY_FLOOR", 0.25),
        ),
    ),
    (
        "STY_28_THAO_THIET_XAM_THUC", 28, "Thao Thiết Xâm Thực", "Scourge Flesh Incursion",
        "HU_KHONG_DI_BIEN", "Hư Không Dị Biến",
        ("#2f1c24", "#1e1016", "#4a2c39", "#1a2414", "#23121a"), 0.40, (1.4, 10),
        None, "scourge_parasites_and_devouring_abominations",
        (
            ("prop_writhing_wall_tentacle", "Xúc tu quỷ quằn quại trên vách", "Writhing Wall Tentacle", "WALL_ADJACENT", 0.35),
            ("prop_hatching_parasite_egg", "Kén ký sinh trùng sắp nở", "Hatching Parasite Egg", "FLOOR_EDGE", 0.30),
            ("prop_acid_dissolved_skeleton", "Khung sương thú bị dịch tiêu hóa ăn mòn", "Acid Dissolved Skeleton", "ANY_FLOOR", 0.25),
        ),
    ),
    (
        "STY_29_U_MINH_TA_CANH", 29, "U Minh Tà Cảnh", "Nether Phantasm Domain",
        "HU_KHONG_DI_BIEN", "Hư Không Dị Biến",
        ("#1c242c", "#11171d", "#2c3945", "#0e1720", "#151e26"), 0.42, (1.2, 8),
        None, "nether_phantasms_and_soul_harvesters",
        (
            ("prop_slanted_nameless_gravestone", "Bia mộ vô danh nghiêng ngả", "Slanted Nameless Gravestone", "FLOOR_EDGE", 0.35),
            ("prop_blueflame_skull_lantern", "Đèn lồng đầu lâu phát ánh lam", "Blue Flame Skull Lantern", "WALL_ADJACENT", 0.25),
            ("prop_black_paper_talismans", "Chuỗi bùa giấy đen phơ phất", "Black Paper Talismans", "PATH_SIDE", 0.25),
        ),
    ),
    (
        "STY_30_TAN_TICH_THIEN_CUNG_HOANG_PHE", 30, "Tàn Tích Thiên Cung Hoang Phế", "Boundless Ruined Apex",
        "HU_KHONG_DI_BIEN", "Hư Không Dị Biến",
        ("#2c2832", "#1c1921", "#443e4e", "#0c0a10", "#221e28"), 0.30, (1.0, 0),
        None, "sovereign_fallen_knights_and_celestial_wraiths",
        (
            ("prop_collapsed_stone_throne", "Ngai vàng đá sụp đổ một góc", "Collapsed Stone Throne", "DEAD_END", 0.25),
            ("prop_embedded_broken_colossal_sword", "Cự kiếm gãy cắm sâu vào đá", "Broken Colossal Sword in Stone", "ANY_FLOOR", 0.35),
            ("prop_slanted_marble_pillar", "Cột trụ cẩm thạch gãy gục cắm nghiêng", "Slanted Marble Pillar", "WALL_ADJACENT", 0.35),
        ),
    ),
)


def _build_tiles_for_style(style_id: str, palette: MapStylePalette) -> List[MapStyleTileMapping]:
    """Generates all 20 canonical TileType bindings (0-19) for a given style."""
    asset_dir = f"client/webapp/assets/map/styles/{style_id.lower()}"
    tile_defs = [
        (0, "VOID", "floor.png", "floor_normal.png", "#050508", 0),
        (1, "FLOOR", "floor.png", "floor_normal.png", palette.floor, 0),
        (2, "WALL", "wall.png", "wall_normal.png", palette.wall, 24),
        (3, "DESTRUCTIBLE_BARRICADE", "wall.png", "wall_normal.png", palette.wall, 20),
        (4, "MUD_POOL", "liquid.png", "liquid_normal.png", palette.liquid, 0),
        (5, "SPIKE_TRAP", "floor.png", "floor_normal.png", palette.floor, 0),
        (6, "CRUMBLED_DEBRIS", "floor.png", "floor_normal.png", palette.floor, 0),
        (7, "BONE_PILE", "floor.png", "floor_normal.png", palette.floor, 0),
        (8, "POISON_VENT", "liquid.png", "liquid_normal.png", palette.liquid, 0),
        (9, "CHASM", "liquid.png", "liquid_normal.png", "#08060c", 0),
        (10, "BOSS_GATE", "wall.png", "wall_normal.png", palette.wall, 28),
        (11, "BOSS_ALTAR", "floor.png", "floor_normal.png", palette.wall, 16),
        (12, "RUNIC_FLOOR", "floor.png", "floor_normal.png", palette.path, 0),
        (13, "PATH", "path.png", "path_normal.png", palette.path, 0),
        (14, "DENSE_TERRAIN", "floor.png", "floor_normal.png", palette.floor, 0),
        (15, "POI", "floor.png", "floor_normal.png", palette.path, 0),
        (16, "ENCOUNTER_LOW", "floor.png", "floor_normal.png", palette.floor, 0),
        (17, "ENCOUNTER_MEDIUM", "floor.png", "floor_normal.png", palette.floor, 0),
        (18, "ENCOUNTER_HIGH", "floor.png", "floor_normal.png", palette.floor, 0),
        (19, "WATER", "liquid.png", "liquid_normal.png", palette.liquid, 0),
    ]
    return [
        MapStyleTileMapping(
            style_id=style_id,
            tile_code=code,
            tile_type_name=name,
            texture_path=f"{asset_dir}/{tex}",
            normal_path=f"{asset_dir}/{norm}",
            procedural_fallback_color=fallback,
            elevation_px=elev,
        )
        for code, name, tex, norm, fallback, elev in tile_defs
    ]


# Global dictionaries populated on module import
MAP_STYLES_BY_ID: Dict[str, MapStyleDefinition] = {}
MAP_STYLES_BY_CODE: Dict[int, MapStyleDefinition] = {}
LEGACY_BIOME_TO_STYLE_ID: Dict[str, str] = {}
STYLE_ID_TO_LEGACY_BIOME: Dict[str, str] = {}
STYLE_TILES_BY_ID: Dict[str, List[MapStyleTileMapping]] = {}
STYLE_PROPS_BY_ID: Dict[str, List[MapStylePropDefinition]] = {}

for (
    s_id, b_code, n_vi, n_en, t_cat, t_cat_vi,
    (c_fl, c_wl, c_pt, c_lq, c_amb), f_dens, (h_slow, h_dps),
    leg_alias, m_family, props_data
) in _RAW_STYLES_DATA:
    pal = MapStylePalette(floor=c_fl, wall=c_wl, path=c_pt, liquid=c_lq, ambient=c_amb)
    light = MapStyleLighting(ambient_hex=c_amb, intensity=1.0, fog_density=f_dens)
    haz = MapStyleHazard(slow_factor=h_slow, dps=h_dps)
    mov_mod = round(1.0 / h_slow, 2)

    style_def = MapStyleDefinition(
        style_id=s_id,
        biome_code=b_code,
        name_vi=n_vi,
        name_en=n_en,
        theme_category=t_cat,
        theme_category_name=t_cat_vi,
        description=f"{n_vi} ({n_en}) - Phong cách {t_cat_vi}.",
        palette=pal,
        lighting=light,
        hazard=haz,
        movement_modifier=mov_mod,
        asset_dir=f"client/webapp/assets/map/styles/{s_id.lower()}",
        monster_family=m_family,
        legacy_alias=leg_alias,
    )

    MAP_STYLES_BY_ID[s_id] = style_def
    MAP_STYLES_BY_CODE[b_code] = style_def

    if leg_alias:
        LEGACY_BIOME_TO_STYLE_ID[leg_alias] = s_id
        STYLE_ID_TO_LEGACY_BIOME[s_id] = leg_alias

    STYLE_TILES_BY_ID[s_id] = _build_tiles_for_style(s_id, pal)

    prop_list: List[MapStylePropDefinition] = []
    for p_id, p_vi, p_en, rule, weight in props_data:
        prop_list.append(
            MapStylePropDefinition(
                style_id=s_id,
                prop_id=p_id,
                name_vi=p_vi,
                name_en=p_en,
                placement_rule=rule,
                spawn_weight=weight,
                sprite_key=p_id,
                sprite_path=f"client/webapp/assets/map/styles/{s_id.lower()}/props/{p_id}.png",
            )
        )
    STYLE_PROPS_BY_ID[s_id] = prop_list


def get_map_style(style_id: str) -> Optional[MapStyleDefinition]:
    """Retrieve MapStyleDefinition by canonical style ID or legacy biome name."""
    if style_id in MAP_STYLES_BY_ID:
        return MAP_STYLES_BY_ID[style_id]
    if style_id in LEGACY_BIOME_TO_STYLE_ID:
        return MAP_STYLES_BY_ID[LEGACY_BIOME_TO_STYLE_ID[style_id]]
    return None


def get_map_style_by_code(biome_code: int) -> Optional[MapStyleDefinition]:
    """Retrieve MapStyleDefinition by biome integer code (1-30)."""
    return MAP_STYLES_BY_CODE.get(biome_code)


def get_style(style_id: str) -> Optional[MapStyleDefinition]:
    """Convenience alias for get_map_style."""
    return get_map_style(style_id)


def get_style_by_code(biome_code: int) -> Optional[MapStyleDefinition]:
    """Convenience alias for get_map_style_by_code."""
    return get_map_style_by_code(biome_code)


def list_styles() -> List[MapStyleDefinition]:
    """Return all 30 canonical MapStyleDefinition objects ordered by biome_code."""
    return sorted(list(MAP_STYLES_BY_ID.values()), key=lambda s: s.biome_code)


def list_available_styles() -> List[str]:
    """Return list of all 30 canonical style IDs."""
    return [s.style_id for s in list_styles()]


def list_styles_by_category(category: str) -> List[MapStyleDefinition]:
    """Return styles belonging to a specific theme category."""
    return [s for s in list_styles() if s.theme_category == category]


def get_tiles_for_style(style_id: str) -> List[MapStyleTileMapping]:
    """Retrieve the 20 TileType mappings for a given style."""
    resolved_id = LEGACY_BIOME_TO_STYLE_ID.get(style_id, style_id)
    return STYLE_TILES_BY_ID.get(resolved_id, [])


def get_props_for_style(style_id: str) -> List[MapStylePropDefinition]:
    """Retrieve decorative props defined for a given style."""
    resolved_id = LEGACY_BIOME_TO_STYLE_ID.get(style_id, style_id)
    return STYLE_PROPS_BY_ID.get(resolved_id, [])
