"""
FreeExile Savage Grimdark Biome Catalog.
Static definitions of 30 procedural biomes, obstacle palettes, and hazard matrices.
100% Savage Grimdark Exile themed (Zero Tu Tien / Xianxia).
"""

from __future__ import annotations
from dataclasses import dataclass
from typing import Dict, List, Optional
from server.world.map_data_types import ObstacleType, TileType


@dataclass(slots=True, frozen=True)
class MapBiomeDefinition:
    biome_id: str
    name: str
    description: str
    primary_tile: TileType
    hazard_slow_factor: float
    obstacle_palette: List[ObstacleType]
    obstacle_density: float
    min_sinuosity_target: float
    ambiance_color_hex: str
    monster_family: str
    biome_code: int = 1


# 30 Canonical Dark Fantasy Cổ Võ Hoang Vực Biomes
_RAW_BIOMES: List[MapBiomeDefinition] = [
    # 1-5: Legacy Biomes
    MapBiomeDefinition(
        biome_id="BLEACHED_BONE_CANYON",
        name="Hẻm Núi Xương Trắng",
        description="Hẻm núi dựng đứng chất đống di cốt của vạn kẻ lưu đày, gió rít qua khe xương lạnh buốt tủy.",
        primary_tile=TileType.FLOOR,
        hazard_slow_factor=1.2,
        obstacle_palette=[
            ObstacleType.DEBRIS_COLLAPSE,
            ObstacleType.BONE_CLUSTER,
            ObstacleType.BARRICADE_WOOD_BONE,
        ],
        obstacle_density=0.14,
        min_sinuosity_target=1.40,
        ambiance_color_hex="#2a2825",
        monster_family="bone_golems_and_vulture_cultists",
        biome_code=1,
    ),
    MapBiomeDefinition(
        biome_id="SAVAGE_MANGROVE_SWAMP",
        name="Bãi Tha Ma Ngập Mặn",
        description="Vùng trũng ngập mặn đục ngầu bùn máu, rễ cây đước cổ thụ giăng mắc bẫy gai xé toạc da thịt.",
        primary_tile=TileType.MUD_POOL,
        hazard_slow_factor=1.8,
        obstacle_palette=[
            ObstacleType.MUD_QUAGMIRE,
            ObstacleType.BARRICADE_WOOD_BONE,
            ObstacleType.CONCEALED_SPIKES,
        ],
        obstacle_density=0.15,
        min_sinuosity_target=1.35,
        ambiance_color_hex="#1a2e1d",
        monster_family="swamp_crawlers_and_blood_leeches",
        biome_code=2,
    ),
    MapBiomeDefinition(
        biome_id="CRIMSON_BLOOD_FOREST",
        name="Rừng Gai Huyết Tộc",
        description="Khu rừng quái đản mọc đầy gai nhọn hút máu, phủ đầy sương mù đỏ sẫm và xác thú hoang hiến tế.",
        primary_tile=TileType.FLOOR,
        hazard_slow_factor=1.4,
        obstacle_palette=[
            ObstacleType.CONCEALED_SPIKES,
            ObstacleType.BONE_CLUSTER,
            ObstacleType.BARRICADE_WOOD_BONE,
        ],
        obstacle_density=0.18,
        min_sinuosity_target=1.30,
        ambiance_color_hex="#3b0d11",
        monster_family="feral_hounds_and_thorn_horrors",
        biome_code=3,
    ),
    MapBiomeDefinition(
        biome_id="OUTCAST_MINE_SHAFTS",
        name="Mỏ Quặng Lưu Đày",
        description="Mạng lưới hầm mỏ bỏ hoang chật hẹp, gỗ chống sụp đổ và xe goòng rỉ sét chặn các ngã rẽ hiểm.",
        primary_tile=TileType.FLOOR,
        hazard_slow_factor=1.3,
        obstacle_palette=[
            ObstacleType.BARRICADE_WOOD_BONE,
            ObstacleType.DEBRIS_COLLAPSE,
            ObstacleType.CONCEALED_SPIKES,
        ],
        obstacle_density=0.20,
        min_sinuosity_target=1.45,
        ambiance_color_hex="#1f1d19",
        monster_family="renegade_miners_and_chasm_spiders",
        biome_code=4,
    ),
    MapBiomeDefinition(
        biome_id="CORRUPTED_FIEND_RUINS",
        name="Phế Tích Ma Thần",
        description="Tàn tích đền thờ man tộc cổ xưa bị tà huyết ô uế ăn mòn, vô số cột đá đổ vỡ tạo thành bẫy trận mê cung.",
        primary_tile=TileType.FLOOR,
        hazard_slow_factor=1.5,
        obstacle_palette=[
            ObstacleType.DEBRIS_COLLAPSE,
            ObstacleType.MUD_QUAGMIRE,
            ObstacleType.BONE_CLUSTER,
            ObstacleType.BARRICADE_WOOD_BONE,
        ],
        obstacle_density=0.16,
        min_sinuosity_target=1.38,
        ambiance_color_hex="#22112b",
        monster_family="fiend_abominations_and_blood_priests",
        biome_code=5,
    ),
    # 6-30: Expanded 30 Styles
    MapBiomeDefinition(
        biome_id="STY_01_HOANG_MANG_CO_LO",
        name="Hoang Mãng Cổ Lộ",
        description="Đường mòn đất nứt nẻ hoang sơ hiểm trở, nơi dã thú hoang dại săn mồi không ngừng nghỉ.",
        primary_tile=TileType.FLOOR,
        hazard_slow_factor=1.0,
        obstacle_palette=[ObstacleType.BONE_CLUSTER, ObstacleType.DEBRIS_COLLAPSE, ObstacleType.BARRICADE_WOOD_BONE],
        obstacle_density=0.15,
        min_sinuosity_target=1.30,
        ambiance_color_hex="#2a2620",
        monster_family="feral_scavengers_and_wild_hounds",
        biome_code=6,
    ),
    MapBiomeDefinition(
        biome_id="STY_03_BO_DA_TAN_XUONG",
        name="Bờ Đá Tàn Xương",
        description="Bờ đá lởm chởm gợn sóng đen ngòm, xác tàu đắm vỡ vụn dạt vào bờ cùng vô số mảnh xương khô.",
        primary_tile=TileType.FLOOR,
        hazard_slow_factor=1.0,
        obstacle_palette=[ObstacleType.DEBRIS_COLLAPSE, ObstacleType.BONE_CLUSTER],
        obstacle_density=0.14,
        min_sinuosity_target=1.32,
        ambiance_color_hex="#1c2630",
        monster_family="strand_scavengers_and_drowned_corpses",
        biome_code=7,
    ),
    MapBiomeDefinition(
        biome_id="STY_04_HOANG_GIOI_CUONG_THU",
        name="Hoang Giới Cuồng Thú",
        description="Thảo nguyên cằn cỗi bão cát cuộn trào, nơi đàn lợn lòi hoang và mãnh thú xông xáo tàn sát.",
        primary_tile=TileType.FLOOR,
        hazard_slow_factor=1.1,
        obstacle_palette=[ObstacleType.BARRICADE_WOOD_BONE, ObstacleType.CONCEALED_SPIKES],
        obstacle_density=0.16,
        min_sinuosity_target=1.30,
        ambiance_color_hex="#2d271e",
        monster_family="feral_boars_and_horned_beasts",
        biome_code=8,
    ),
    MapBiomeDefinition(
        biome_id="STY_05_KHAI_XUONG_CO_CAN",
        name="Khai Xương Cổ Cạn",
        description="Lòng chảo cổ xưa cạn trơ đáy bùn khô nứt, rải rác khung xương cá khổng lồ và kền kền rình rập.",
        primary_tile=TileType.FLOOR,
        hazard_slow_factor=1.0,
        obstacle_palette=[ObstacleType.BONE_CLUSTER, ObstacleType.DEBRIS_COLLAPSE],
        obstacle_density=0.15,
        min_sinuosity_target=1.35,
        ambiance_color_hex="#383228",
        monster_family="desiccated_crawlers_and_bone_vultures",
        biome_code=9,
    ),
    MapBiomeDefinition(
        biome_id="STY_07_DAM_LAY_THOI_RUA",
        name="Đầm Lầy Thối Rữa",
        description="Vùng trũng rêu mục thối rữa nồng nặc khí độc, bùn nhão hút chân và đỉa máu ẩn nấp.",
        primary_tile=TileType.MUD_POOL,
        hazard_slow_factor=1.6,
        obstacle_palette=[ObstacleType.MUD_QUAGMIRE, ObstacleType.CONCEALED_SPIKES],
        obstacle_density=0.18,
        min_sinuosity_target=1.36,
        ambiance_color_hex="#162413",
        monster_family="putrid_corpses_and_swamp_leeches",
        biome_code=10,
    ),
    MapBiomeDefinition(
        biome_id="STY_08_VUC_DAM_BANG_DOC",
        name="Vực Đầm Băng Độc",
        description="Vực sâu đầm băng xám ngắt rét buốt thấu xương, tinh thể độc đóng băng nhô lên cản lối.",
        primary_tile=TileType.MUD_POOL,
        hazard_slow_factor=1.4,
        obstacle_palette=[ObstacleType.MUD_QUAGMIRE, ObstacleType.DEBRIS_COLLAPSE],
        obstacle_density=0.16,
        min_sinuosity_target=1.34,
        ambiance_color_hex="#182926",
        monster_family="bile_serpents_and_frost_abominations",
        biome_code=11,
    ),
    MapBiomeDefinition(
        biome_id="STY_09_HAC_THUY_MIEU_TRAP",
        name="Hắc Thủy Miểu Trạch",
        description="Đầm lầy nước đen sâu thẳm lạnh lẽo, bia mộ cổ ngập nửa dưới bùn và quạ đen lượn vòng.",
        primary_tile=TileType.MUD_POOL,
        hazard_slow_factor=1.5,
        obstacle_palette=[ObstacleType.MUD_QUAGMIRE, ObstacleType.BONE_CLUSTER],
        obstacle_density=0.17,
        min_sinuosity_target=1.35,
        ambiance_color_hex="#121412",
        monster_family="blackwater_drowned_and_scourge_crows",
        biome_code=12,
    ),
    MapBiomeDefinition(
        biome_id="STY_10_DOC_CHIEU_MA_HO",
        name="Độc Chiếu Ma Hồ",
        description="Hồ nước bốc màn sương độc lục sắc huyền ảo ma quái, dây leo tiết mủ bám đầy vách đá trơn trượt.",
        primary_tile=TileType.MUD_POOL,
        hazard_slow_factor=1.3,
        obstacle_palette=[ObstacleType.MUD_QUAGMIRE, ObstacleType.BARRICADE_WOOD_BONE],
        obstacle_density=0.15,
        min_sinuosity_target=1.33,
        ambiance_color_hex="#1c2b20",
        monster_family="venom_serpents_and_marsh_abominations",
        biome_code=13,
    ),
    MapBiomeDefinition(
        biome_id="STY_12_SA_COT_HOANG_MAC",
        name="Sa Cốt Hoang Mạc",
        description="Hoang mạc mênh mông cát vàng cằn cỗi chôn vùi sọ thú cổ đại, bọ cạp xương khổng lồ phục kích.",
        primary_tile=TileType.FLOOR,
        hazard_slow_factor=1.2,
        obstacle_palette=[ObstacleType.BONE_CLUSTER, ObstacleType.DEBRIS_COLLAPSE],
        obstacle_density=0.15,
        min_sinuosity_target=1.38,
        ambiance_color_hex="#3d3427",
        monster_family="dune_bone_scorpions_and_sand_marauders",
        biome_code=14,
    ),
    MapBiomeDefinition(
        biome_id="STY_13_CON_CAT_MA_QUY",
        name="Cồn Cát Ma Quỷ",
        description="Những cồn cát đen chuyển dịch kỳ dị trong đêm tối, hố sụt lún nguy hiểm chực chờ nuốt chửng kẻ sơ sểnh.",
        primary_tile=TileType.FLOOR,
        hazard_slow_factor=1.0,
        obstacle_palette=[ObstacleType.DEBRIS_COLLAPSE, ObstacleType.CONCEALED_SPIKES],
        obstacle_density=0.14,
        min_sinuosity_target=1.35,
        ambiance_color_hex="#1c1a20",
        monster_family="ghost_dune_wraiths_and_shadow_stalkers",
        biome_code=15,
    ),
    MapBiomeDefinition(
        biome_id="STY_14_VUC_DOI_NUOT_CHUNG",
        name="Vực Đói Nuốt Chửng",
        description="Vực sâu hun hút không thấy đáy, mấu cầu treo đứt gãy đung đưa trong cơn gió rít đầy đói khát.",
        primary_tile=TileType.FLOOR,
        hazard_slow_factor=1.1,
        obstacle_palette=[ObstacleType.DEBRIS_COLLAPSE, ObstacleType.BONE_CLUSTER],
        obstacle_density=0.16,
        min_sinuosity_target=1.40,
        ambiance_color_hex="#28221f",
        monster_family="starved_ghouls_and_abyssal_bats",
        biome_code=16,
    ),
    MapBiomeDefinition(
        biome_id="STY_15_QUY_PHONG_HAC_NHAI",
        name="Quỷ Phong Hắc Nhai",
        description="Vách đá đen sừng sững đón nhận những cơn bão quỷ gầm thét, cờ tế rách nát phấp phới tang tóc.",
        primary_tile=TileType.FLOOR,
        hazard_slow_factor=1.2,
        obstacle_palette=[ObstacleType.DEBRIS_COLLAPSE, ObstacleType.BARRICADE_WOOD_BONE],
        obstacle_density=0.15,
        min_sinuosity_target=1.36,
        ambiance_color_hex="#1e1c28",
        monster_family="demon_storm_raptors_and_wind_slayers",
        biome_code=17,
    ),
    MapBiomeDefinition(
        biome_id="STY_17_DIA_DAO_HUYET_THACH",
        name="Địa Đạo Huyết Thạch",
        description="Hầm sâu địa đạo rực đỏ sắc tinh thể huyết thạch lấp lánh hung hiểm, quái nhân quặng mò mẫm trong tối.",
        primary_tile=TileType.FLOOR,
        hazard_slow_factor=1.1,
        obstacle_palette=[ObstacleType.DEBRIS_COLLAPSE, ObstacleType.CONCEALED_SPIKES],
        obstacle_density=0.18,
        min_sinuosity_target=1.42,
        ambiance_color_hex="#2d1419",
        monster_family="bloodstone_golems_and_chittering_beetles",
        biome_code=18,
    ),
    MapBiomeDefinition(
        biome_id="STY_18_MIENG_LUA_NUNG_MAU",
        name="Miệng Lửa Nung Máu",
        description="Hõm chảo núi lửa rực lửa sôi sục, bễ rèn khổng lồ của man tộc rỉ dịch đỏ thẫm hung hãn.",
        primary_tile=TileType.FLOOR,
        hazard_slow_factor=1.2,
        obstacle_palette=[ObstacleType.DEBRIS_COLLAPSE, ObstacleType.BARRICADE_WOOD_BONE],
        obstacle_density=0.17,
        min_sinuosity_target=1.38,
        ambiance_color_hex="#3b1111",
        monster_family="magma_behemoths_and_bloodforge_smiths",
        biome_code=19,
    ),
    MapBiomeDefinition(
        biome_id="STY_19_HAM_LUA_LUYEN_NGUC",
        name="Hầm Lửa Luyện Ngục",
        description="Vực nham thạch nóng chảy sủi bọt ngùn ngụt, than hồng âm ỉ thiêu đốt da thịt của kẻ ngã xuống.",
        primary_tile=TileType.FLOOR,
        hazard_slow_factor=1.3,
        obstacle_palette=[ObstacleType.DEBRIS_COLLAPSE, ObstacleType.CONCEALED_SPIKES],
        obstacle_density=0.19,
        min_sinuosity_target=1.40,
        ambiance_color_hex="#331515",
        monster_family="purgatory_fiends_and_lava_crawlers",
        biome_code=20,
    ),
    MapBiomeDefinition(
        biome_id="STY_20_VUC_THAM_XICH_THIET",
        name="Vực Thẳm Xích Thiết",
        description="Vực sâu ngổn ngang xích sắt rỉ sét quấn quanh cột trụ cơ khí cổ hỏng hóc, bù nhìn sắt mục nát rên rỉ.",
        primary_tile=TileType.FLOOR,
        hazard_slow_factor=1.1,
        obstacle_palette=[ObstacleType.BARRICADE_WOOD_BONE, ObstacleType.DEBRIS_COLLAPSE],
        obstacle_density=0.16,
        min_sinuosity_target=1.35,
        ambiance_color_hex="#281a11",
        monster_family="rust_automata_and_iron_scavengers",
        biome_code=21,
    ),
    MapBiomeDefinition(
        biome_id="STY_22_PHE_TICH_XE_THIT",
        name="Phế Tích Xẻ Thịt",
        description="Đấu trường hoang tàn rỉ máu tử tù, móc sắt treo xương và lồng sắt giam giữ dã nhân điên dại.",
        primary_tile=TileType.FLOOR,
        hazard_slow_factor=1.2,
        obstacle_palette=[ObstacleType.BARRICADE_WOOD_BONE, ObstacleType.BONE_CLUSTER],
        obstacle_density=0.17,
        min_sinuosity_target=1.36,
        ambiance_color_hex="#291218",
        monster_family="slaughter_warlords_and_arena_butchers",
        biome_code=22,
    ),
    MapBiomeDefinition(
        biome_id="STY_23_TE_DAN_MAN_HOANG",
        name="Tế Đàn Man Hoang",
        description="Cự thạch nguyên khối khắc tà ấn cổ của thú tổ man tộc, đống củi tế bốc khói đen kịt tanh nồng.",
        primary_tile=TileType.FLOOR,
        hazard_slow_factor=1.0,
        obstacle_palette=[ObstacleType.BONE_CLUSTER, ObstacleType.DEBRIS_COLLAPSE],
        obstacle_density=0.15,
        min_sinuosity_target=1.35,
        ambiance_color_hex="#26221c",
        monster_family="primal_cultists_and_totemic_shamans",
        biome_code=23,
    ),
    MapBiomeDefinition(
        biome_id="STY_24_BE_THO_QUY_DOAT_MENH",
        name="Bệ Thờ Quỷ Đoạt Mệnh",
        description="Đỉnh cao đền thờ hiến tế linh hồn đẫm máu, đỉnh đồng ba chân rỉ xanh và trụ đá nhọn hoắt răng quỷ.",
        primary_tile=TileType.FLOOR,
        hazard_slow_factor=1.1,
        obstacle_palette=[ObstacleType.BARRICADE_WOOD_BONE, ObstacleType.CONCEALED_SPIKES],
        obstacle_density=0.18,
        min_sinuosity_target=1.38,
        ambiance_color_hex="#201226",
        monster_family="apex_executioners_and_scourge_acolytes",
        biome_code=24,
    ),
    MapBiomeDefinition(
        biome_id="STY_25_VAN_KIEP_MIEU_DIA",
        name="Vạn Kiếp Miếu Địa",
        description="Hầm mộ vạn kiếp u tối âm u chất đầy quan tài đá nắp lệch, giá nến mỡ người leo lét ánh lam tà.",
        primary_tile=TileType.FLOOR,
        hazard_slow_factor=1.2,
        obstacle_palette=[ObstacleType.DEBRIS_COLLAPSE, ObstacleType.BONE_CLUSTER],
        obstacle_density=0.16,
        min_sinuosity_target=1.40,
        ambiance_color_hex="#1d1b22",
        monster_family="crypt_mummies_and_tomb_wraiths",
        biome_code=25,
    ),
    MapBiomeDefinition(
        biome_id="STY_26_COI_HU_KHONG_TUYET_DIA",
        name="Cõi Hư Không Tuyệt Địa",
        description="Vết nứt không gian đen sẫm rách toạc thực tại, tinh thể hư không lơ lửng xoay tròn tỏa sát khí ghê rợn.",
        primary_tile=TileType.FLOOR,
        hazard_slow_factor=1.3,
        obstacle_palette=[ObstacleType.DEBRIS_COLLAPSE, ObstacleType.CONCEALED_SPIKES],
        obstacle_density=0.17,
        min_sinuosity_target=1.42,
        ambiance_color_hex="#171026",
        monster_family="void_walkers_and_rift_scavengers",
        biome_code=26,
    ),
    MapBiomeDefinition(
        biome_id="STY_27_VET_NUT_VO_HAN_HUYET_GIOI",
        name="Vết Nứt Vô Hạn Huyết Giới",
        description="Vùng đất thịt thối rữa đập thình thịch nhịp tim quái đản, mắt quỷ mở thao láo theo dõi từng bước chân.",
        primary_tile=TileType.FLOOR,
        hazard_slow_factor=1.2,
        obstacle_palette=[ObstacleType.BONE_CLUSTER, ObstacleType.CONCEALED_SPIKES],
        obstacle_density=0.18,
        min_sinuosity_target=1.39,
        ambiance_color_hex="#2e0d14",
        monster_family="crimson_flesh_horrors_and_scourge_larvae",
        biome_code=27,
    ),
    MapBiomeDefinition(
        biome_id="STY_28_THAO_THIET_XAM_THUC",
        name="Thao Thiết Xâm Thực",
        description="Cơn xâm thực ăn mòn của ký sinh trùng cổ, kén ấu trùng lúc nhúc và xúc tu ngoằn ngoèo bám khắp mặt đất.",
        primary_tile=TileType.MUD_POOL,
        hazard_slow_factor=1.4,
        obstacle_palette=[ObstacleType.MUD_QUAGMIRE, ObstacleType.CONCEALED_SPIKES],
        obstacle_density=0.19,
        min_sinuosity_target=1.38,
        ambiance_color_hex="#23121a",
        monster_family="scourge_parasites_and_devouring_abominations",
        biome_code=28,
    ),
    MapBiomeDefinition(
        biome_id="STY_29_U_MINH_TA_CANH",
        name="U Minh Tà Cảnh",
        description="Lãnh địa ma quái vất vưởng cô hồn tử sĩ, bùa giấy đen bay lượn trong làn gió độc lạnh thấu xương.",
        primary_tile=TileType.FLOOR,
        hazard_slow_factor=1.2,
        obstacle_palette=[ObstacleType.BONE_CLUSTER, ObstacleType.DEBRIS_COLLAPSE],
        obstacle_density=0.16,
        min_sinuosity_target=1.35,
        ambiance_color_hex="#151e26",
        monster_family="nether_phantasms_and_soul_harvesters",
        biome_code=29,
    ),
    MapBiomeDefinition(
        biome_id="STY_30_TAN_TICH_THIEN_CUNG_HOANG_PHE",
        name="Tàn Tích Thiên Cung Hoang Phế",
        description="Đỉnh cao cung điện đổ nát chất chồng cự kiếm gãy gục, ngai vàng vỡ vụn là nhân chứng của thời đại sụp đổ.",
        primary_tile=TileType.FLOOR,
        hazard_slow_factor=1.0,
        obstacle_palette=[ObstacleType.DEBRIS_COLLAPSE, ObstacleType.BARRICADE_WOOD_BONE],
        obstacle_density=0.15,
        min_sinuosity_target=1.35,
        ambiance_color_hex="#221e28",
        monster_family="sovereign_fallen_knights_and_celestial_wraiths",
        biome_code=30,
    ),
]

MAP_BIOMES: Dict[str, MapBiomeDefinition] = {b.biome_id: b for b in _RAW_BIOMES}
BIOMES_BY_CODE: Dict[int, MapBiomeDefinition] = {b.biome_code: b for b in _RAW_BIOMES}

BIOME_ALIASES: Dict[str, str] = {
    "STY_11_HEM_NUI_XUONG_TRANG": "BLEACHED_BONE_CANYON",
    "STY_06_BAI_THA_MA_NGAP_MAN": "SAVAGE_MANGROVE_SWAMP",
    "STY_02_HUYET_SAT_LAM": "CRIMSON_BLOOD_FOREST",
    "STY_16_MO_QUANG_LUU_DAY": "OUTCAST_MINE_SHAFTS",
    "STY_21_PHE_TICH_MA_THAN": "CORRUPTED_FIEND_RUINS",
}


def get_biome_definition(biome_id: str) -> MapBiomeDefinition:
    """Retrieve MapBiomeDefinition by canonical ID, alias, or string/integer biome code."""
    if isinstance(biome_id, int) or (isinstance(biome_id, str) and biome_id.isdigit()):
        b = get_biome_by_code(int(biome_id))
        if b is not None:
            return b

    resolved = BIOME_ALIASES.get(biome_id, biome_id)
    if resolved in MAP_BIOMES:
        return MAP_BIOMES[resolved]
    raise ValueError(f"Unknown biome_id '{biome_id}'. Available: {list_available_biomes()}")


def get_biome_by_code(code: int) -> Optional[MapBiomeDefinition]:
    """Retrieve MapBiomeDefinition by integer code (1-30)."""
    return BIOMES_BY_CODE.get(code)


def list_available_biomes() -> List[str]:
    """Return all 30 primary canonical biome IDs."""
    return list(MAP_BIOMES.keys())
