"""
Item Affix & Stat Database Catalog for FreeExile.
Contains canonical affix definitions, tiers (T1-T5), slot compatibility,
and overpowered trade-off affixes with severe downsides.
Strictly decoupled from crafting execution logic.
"""

from __future__ import annotations
from typing import Dict, List, Set, Optional
from server.world.item_crafting_types import (
    ItemSlot,
    AffixType,
    AffixDefinition,
    DownsidePenaltyType,
)

# ---------------------------------------------------------------------------
# SLOT GROUPS
# ---------------------------------------------------------------------------
ALL_WEAPONS: Set[ItemSlot] = {ItemSlot.WEAPON_1H, ItemSlot.WEAPON_2H}
ALL_ARMOURS: Set[ItemSlot] = {
    ItemSlot.BODY_ARMOUR,
    ItemSlot.HELMET,
    ItemSlot.GLOVES,
    ItemSlot.BOOTS,
    ItemSlot.SHIELD,
}
ALL_JEWELRY: Set[ItemSlot] = {ItemSlot.RING, ItemSlot.AMULET, ItemSlot.BELT}
ALL_SLOTS: Set[ItemSlot] = ALL_WEAPONS | ALL_ARMOURS | ALL_JEWELRY

# ---------------------------------------------------------------------------
# STANDARD AFFIX PROGRESSION TIERS (TIER 1 TO TIER 15)
# T1 = God-tier / Apex (iLvl 85+, weight 20) -> T15 = Sơ Cấp (iLvl 1+, weight 1200)
# ---------------------------------------------------------------------------
STANDARD_ILVLS: List[int] = [85, 80, 75, 70, 65, 60, 54, 48, 42, 36, 30, 24, 18, 10, 1]
STANDARD_WEIGHTS: List[int] = [20, 45, 75, 110, 160, 220, 290, 370, 460, 560, 670, 790, 920, 1050, 1200]


def _build_15_tiers(
    prefix_id: str,
    affix_type: AffixType,
    allowed_slots: Set[ItemSlot],
    tiers_data: List[Tuple[str, float, float]],
) -> List[AffixDefinition]:
    """Builds full 15-tier definition list for an affix family."""
    defs: List[AffixDefinition] = []
    for idx, (title, min_v, max_v) in enumerate(tiers_data):
        tier_num = idx + 1
        mod_id = f"{prefix_id}_t{tier_num}"
        name = f"{title} (T{tier_num})"
        ilvl = STANDARD_ILVLS[idx]
        weight = STANDARD_WEIGHTS[idx]
        defs.append(AffixDefinition(mod_id, name, affix_type, tier_num, ilvl, min_v, max_v, weight, allowed_slots))
    return defs


# 12 CORE AFFIX FAMILIES WITH 15 TIERS EACH
_PHYS_PCT_DATA: List[Tuple[str, float, float]] = [
    ("Huyết Phách Khát Máu %", 150.0, 180.0), ("Cương Thiết Trảm Kích %", 135.0, 149.0),
    ("Sơn Băng Khai Lộ %", 120.0, 134.0), ("Tàn Nhẫn Huyết Nhận %", 105.0, 119.0),
    ("Thô Nhám Đao Ba %", 90.0, 104.0), ("Toái Cốt Nhận %", 78.0, 89.0),
    ("Hung Sát Trảm %", 67.0, 77.0), ("Thiết Giáp Khai %", 57.0, 66.0),
    ("Trọng Lực Kích %", 48.0, 56.0), ("Đao Khí Sơ Phát %", 40.0, 47.0),
    ("Bén Nhọn Phong Nhận %", 32.0, 39.0), ("Sắt Bén Cốt Khí %", 25.0, 31.0),
    ("Gọt Cắt Nhẹ %", 18.0, 24.0), ("Sơ Cấp Đao Vết %", 12.0, 17.0),
    ("Vết Khắc Sơ Khai %", 5.0, 11.0),
]

_FLAT_PHYS_DATA: List[Tuple[str, float, float]] = [
    ("Thần Lực Cổ Thú", 50.0, 80.0), ("Bá Vương Trảm Thiết", 42.0, 49.0),
    ("Kình Lực Toái Cốt", 35.0, 41.0), ("Cường Lực Trảm", 29.0, 34.0),
    ("Thiết Thạch Quyền", 24.0, 28.0), ("Cương Kình Nhận", 20.0, 23.0),
    ("Huyết Kích Lực", 17.0, 19.0), ("Trọng Kích Đao", 14.0, 16.0),
    ("Khai Sơn Lực", 12.0, 13.0), ("Lực Đao Cổ Xưa", 10.0, 11.0),
    ("Cố Lực Vững", 8.0, 9.0), ("Sức Vung Tay", 6.0, 7.0),
    ("Vết Bầm Tím", 4.0, 5.0), ("Cố Lực Nhẹ", 2.0, 3.0),
    ("Vết Cào Xước", 1.0, 2.0),
]

_FIRE_FLAT_DATA: List[Tuple[str, float, float]] = [
    ("Liệt Diễm Thiêu Hồn", 70.0, 110.0), ("Xích Hỏa Phần Thiên", 58.0, 69.0),
    ("Dung Nham Sôi Trào", 48.0, 57.0), ("Hỏa Diễm Tán Lạc", 40.0, 47.0),
    ("Địa Ngục Liệt Hỏa", 33.0, 39.0), ("Xích Viêm Kích", 27.0, 32.0),
    ("Chước Nhiệt Khí", 22.0, 26.0), ("Nung Đỏ Thiết", 18.0, 21.0),
    ("Hỏa Tinh Nhận", 15.0, 17.0), ("Lửa Đỏ Rực", 12.0, 14.0),
    ("Hơi Nóng Cháy", 9.0, 11.0), ("Hạt Bụi Lửa", 7.0, 8.0),
    ("Đốm Lửa Tàn", 5.0, 6.0), ("Tro Huyết Nóng", 3.0, 4.0),
    ("Tàn Hỏa Đốm Tro", 1.0, 2.0),
]

_LIFE_DATA: List[Tuple[str, float, float]] = [
    ("Bất Diệt Huyết Mạch", 120.0, 150.0), ("Huyết Phách Hùng Hậu", 108.0, 119.0),
    ("Khí Huyết Dồi Dào", 97.0, 107.0), ("Thể Phách Kiên Định", 86.0, 96.0),
    ("Huyết Hải Sinh Sôi", 76.0, 85.0), ("Chân Thể Cường Hóa", 67.0, 75.0),
    ("Cốt Nhục Vững Chắc", 58.0, 66.0), ("Khỏe Khoắn Khí Huyết", 50.0, 57.0),
    ("Bền Bỉ Thể Lực", 42.0, 49.0), ("Mạch Máu Dị Thường", 35.0, 41.0),
    ("Sức Sống Cổ Man", 28.0, 34.0), ("Huyết Khí Tinh Khôi", 22.0, 27.0),
    ("Dưỡng Khí Thể Chất", 16.0, 21.0), ("Khí Tức Sơ Khai", 10.0, 15.0),
    ("Tia Máu Mong Manh", 5.0, 9.0),
]

_ARMOR_FLAT_DATA: List[Tuple[str, float, float]] = [
    ("Bàn Thạch Hộ Thể Giáp", 450.0, 650.0), ("Trọng Thiết Thần Giáp", 380.0, 449.0),
    ("Dày Dặn Cốt Giáp", 320.0, 379.0), ("Tấm Thép Gai", 270.0, 319.0),
    ("Kiên Cố Hắc Ngự", 220.0, 269.0), ("Thành Lũy Cốt Khôi", 180.0, 219.0),
    ("Vảy Khổng Thú", 145.0, 179.0), ("Bọc Da Dày", 115.0, 144.0),
    ("Miếng Sắt Đúc", 90.0, 114.0), ("Khí Công Chắn", 70.0, 89.0),
    ("Bản Gỗ Nẹp Sắt", 52.0, 69.0), ("Tấm Da Rừng", 38.0, 51.0),
    ("Lớp Xương Vụn", 26.0, 37.0), ("Miếng Sắt Rỉ", 16.0, 25.0),
    ("Vỏ Vụn Mỏng Manh", 8.0, 15.0),
]

_MOVE_SPD_DATA: List[Tuple[str, float, float]] = [
    ("Huyễn Ảnh Thần Tốc %", 30.0, 35.0), ("Cuồng Phong Độn Bộ %", 28.0, 29.0),
    ("Linh Miêu Thân Pháp %", 26.0, 27.0), ("Nhanh Chân Trườn Né %", 24.0, 25.0),
    ("Thoát Xác Bộ %", 22.0, 23.0), ("Lăng Ba Bộ %", 20.0, 21.0),
    ("Nhẹ Nhàng Độn Pháp %", 18.0, 19.0), ("Bước Dài Chạy Nhanh %", 16.0, 17.0),
    ("Lướt Cỏ Đạp Gai %", 14.0, 15.0), ("Vút Gió Băng Rừng %", 12.0, 13.0),
    ("Khinh Thân Thân Pháp %", 10.0, 11.0), ("Nhanh Chân Độn %", 8.0, 9.0),
    ("Vội Vàng Bước %", 6.0, 7.0), ("Tập Tễnh Bước Đi %", 4.0, 5.0),
    ("Bước Lê Chân Mệt %", 2.0, 3.0),
]

_ATK_SPD_DATA: List[Tuple[str, float, float]] = [
    ("Thiềm Thừ Cuồng Kích %", 25.0, 30.0), ("Tấn Tật Trảm Nhận %", 23.0, 24.0),
    ("Tốc Đao Lưu Ảnh %", 21.0, 22.0), ("Nhanh Tay Trảm Kích %", 19.0, 20.0),
    ("Bão Phong Vũ Điệu %", 17.0, 18.0), ("Tật Phong Loạn Vũ %", 15.0, 16.0),
    ("Điện Quang Nhất Thiểm %", 13.0, 14.0), ("Nhanh Nhẹn Cốt Trảo %", 11.0, 12.0),
    ("Thao Thao Bất Tuyệt %", 9.0, 10.0), ("Liên Hoàn Kích %", 7.0, 8.0),
    ("Thuần Thục Ra Đao %", 5.0, 6.0), ("Đều Đặn Vung Kiếm %", 4.0, 4.0),
    ("Nhanh Hơn Chút %", 3.0, 3.0), ("Gượng Gạo Vung Đao %", 2.0, 2.0),
    ("Lóng Ngóng Ra Đòn %", 1.0, 1.0),
]

_CRIT_CHANCE_DATA: List[Tuple[str, float, float]] = [
    ("Đoạt Mệnh Điểm Huyệt %", 35.0, 45.0), ("Chí Mạng Khai Khiếu %", 32.0, 34.0),
    ("Chính Xác Nhắm Trúng %", 29.0, 31.0), ("Tập Trung Điểm Yếu %", 26.0, 28.0),
    ("Nhược Điểm Thấu Thị %", 23.0, 25.0), ("Hiểm Hóc Nhát Chém %", 20.0, 22.0),
    ("Bạo Liệt Công Kích %", 17.0, 19.0), ("Đột Kích Nhãn Mâu %", 14.0, 16.0),
    ("Phán Đoán Khí Mạch %", 12.0, 13.0), ("Chuẩn Xác Ra Tay %", 10.0, 11.0),
    ("Lựa Góc Ra Chiêu %", 8.0, 9.0), ("Canh Chuẩn Đòn Đánh %", 6.0, 7.0),
    ("May Mắn Trúng Đích %", 4.0, 5.0), ("Chạm Đúng Chỗ Yếu %", 3.0, 3.0),
    ("Ngẫu Nhiên Chém Trúng %", 1.0, 2.0),
]

_CRIT_MULTI_DATA: List[Tuple[str, float, float]] = [
    ("Toái Cốt Đoạn Cân Bội Số %", 50.0, 65.0), ("Tuyệt Mệnh Bạo Kích %", 44.0, 49.0),
    ("Trùng Kích Nặng Nề %", 39.0, 43.0), ("Sát Thương Nhấn Sâu %", 34.0, 38.0),
    ("Toái Thiết Cường Kích %", 30.0, 33.0), ("Gãy Xương Nát Thịt %", 26.0, 29.0),
    ("Đẫm Máu Trảm Kích %", 22.0, 25.0), ("Nứt Cốt Độc Thủ %", 18.0, 21.0),
    ("Khai Phá Vết Thương %", 15.0, 17.0), ("Huyết Nhận Xé Thịt %", 12.0, 14.0),
    ("Xuyên Da Thịt Đau %", 10.0, 11.0), ("Vết Thương Sâu %", 8.0, 9.0),
    ("Vết Cắt Rách Da %", 6.0, 7.0), ("Đòn Chém Nặng Hơn %", 4.0, 5.0),
    ("Vết Cào Rách Nhẹ %", 2.0, 3.0),
]

_FIRE_RES_DATA: List[Tuple[str, float, float]] = [
    ("Kháng Hỏa Chân Thể %", 45.0, 50.0), ("Hỏa Miên Khí Công %", 41.0, 44.0),
    ("Cách Nhiệt Chân Khí %", 37.0, 40.0), ("Chống Nóng Da Thú %", 33.0, 36.0),
    ("Thuần Dương Hộ Thể %", 29.0, 32.0), ("Ngự Diễm Cốt Giáp %", 25.0, 28.0),
    ("Tránh Nắng Sa Mạc %", 22.0, 24.0), ("Ngăn Lửa Than Hồng %", 19.0, 21.0),
    ("Kháng Hỏa Thiêu Đốt %", 16.0, 18.0), ("Da Dày Chống Bỏng %", 13.0, 15.0),
    ("Làm Mát Khí Huyết %", 10.0, 12.0), ("Áo Chống Tro Nóng %", 8.0, 9.0),
    ("Chịu Nóng Sơ Khai %", 6.0, 7.0), ("Tránh Hơi Nóng Nhẹ %", 4.0, 5.0),
    ("Đốm Nóng Lướt Qua %", 1.0, 3.0),
]

_COLD_RES_DATA: List[Tuple[str, float, float]] = [
    ("Băng Phách Chân Thể %", 45.0, 50.0), ("Ngự Hàn Chân Khí %", 41.0, 44.0),
    ("Áo Ấm Khí Huyết %", 37.0, 40.0), ("Chống Rét Lông Thú %", 33.0, 36.0),
    ("Băng Sương Bất Xâm %", 29.0, 32.0), ("Cốt Tủy Ấm Áp %", 25.0, 28.0),
    ("Ngăn Gió Tuyết Sơn %", 22.0, 24.0), ("Chống Lạnh Cực Bắc %", 19.0, 21.0),
    ("Dày Dặn Ngăn Buốt %", 16.0, 18.0), ("Khí Công Chống Đông %", 13.0, 15.0),
    ("Thân Nhiệt Ổn Định %", 10.0, 12.0), ("Vải Dạ Giữ Ấm %", 8.0, 9.0),
    ("Chịu Lạnh Sơ Khai %", 6.0, 7.0), ("Chống Gió Se Se %", 4.0, 5.0),
    ("Cản Gió Lạnh Nhẹ %", 1.0, 3.0),
]

_CHAOS_RES_DATA: List[Tuple[str, float, float]] = [
    ("Tịnh Hóa U Minh Ma Khí %", 31.0, 35.0), ("Tẩy Uế Cốt Tủy %", 28.0, 30.0),
    ("Kháng Tà Khí %", 25.0, 27.0), ("Tỉnh Táo Thần Trí %", 22.0, 24.0),
    ("Chống Ăn Mòn Hủ Độc %", 19.0, 21.0), ("Tâm Thần Bất Động %", 17.0, 18.0),
    ("Thanh Lọc Huyết Thể %", 15.0, 16.0), ("Chống Độc Thảo Dược %", 13.0, 14.0),
    ("Lọc Khí Uế Khí %", 11.0, 12.0), ("Ổn Định Kinh Mạch %", 9.0, 10.0),
    ("Cố Thủ Tâm Thần %", 7.0, 8.0), ("Kháng Độc Man Tộc %", 5.0, 6.0),
    ("Tránh Độc Khí Rừng %", 4.0, 4.0), ("Kháng Khí Độc Nhẹ %", 3.0, 3.0),
    ("Chống Uế Tạp Khí %", 1.0, 2.0),
]

CANONICAL_AFFIX_DEFINITIONS: List[AffixDefinition] = (
    _build_15_tiers("pref_phys_pct", AffixType.PREFIX, ALL_WEAPONS, _PHYS_PCT_DATA)
    + _build_15_tiers("pref_flat_phys", AffixType.PREFIX, ALL_WEAPONS, _FLAT_PHYS_DATA)
    + _build_15_tiers("pref_fire_flat", AffixType.PREFIX, ALL_WEAPONS | {ItemSlot.RING, ItemSlot.AMULET}, _FIRE_FLAT_DATA)
    + _build_15_tiers("pref_life", AffixType.PREFIX, ALL_ARMOURS | ALL_JEWELRY, _LIFE_DATA)
    + _build_15_tiers("pref_armor_flat", AffixType.PREFIX, {ItemSlot.BODY_ARMOUR, ItemSlot.SHIELD, ItemSlot.HELMET}, _ARMOR_FLAT_DATA)
    + [
        AffixDefinition("pref_all_skills_t1", "Vô Thượng Cổ Võ Ấn +2 (T1)", AffixType.PREFIX, 1, 86, 2.0, 2.0, 20, {ItemSlot.AMULET}),
        AffixDefinition("pref_all_skills_t2", "Cổ Võ Chân Truyền +1 (T2)", AffixType.PREFIX, 2, 75, 1.0, 1.0, 80, {ItemSlot.AMULET}),
    ]
    + _build_15_tiers("suff_move_spd", AffixType.SUFFIX, {ItemSlot.BOOTS}, _MOVE_SPD_DATA)
    + _build_15_tiers("suff_atk_spd", AffixType.SUFFIX, ALL_WEAPONS | {ItemSlot.GLOVES}, _ATK_SPD_DATA)
    + _build_15_tiers("suff_crit_chance", AffixType.SUFFIX, ALL_WEAPONS | {ItemSlot.RING, ItemSlot.AMULET, ItemSlot.HELMET}, _CRIT_CHANCE_DATA)
    + _build_15_tiers("suff_crit_multi", AffixType.SUFFIX, ALL_WEAPONS | {ItemSlot.AMULET}, _CRIT_MULTI_DATA)
    + _build_15_tiers("suff_fire_res", AffixType.SUFFIX, ALL_ARMOURS | ALL_JEWELRY, _FIRE_RES_DATA)
    + _build_15_tiers("suff_cold_res", AffixType.SUFFIX, ALL_ARMOURS | ALL_JEWELRY, _COLD_RES_DATA)
    + _build_15_tiers("suff_chaos_res", AffixType.SUFFIX, ALL_ARMOURS | ALL_JEWELRY, _CHAOS_RES_DATA)
)

# ---------------------------------------------------------------------------
# OVERPOWERED TRADE-OFF AFFIXES (DÒNG CỰC BÁ ĐẠO ĐI KÈM DÒNG NHƯỢNG ĐIỂM)
# Mượn sức mạnh Ma Thần - Trả giá bằng thể phách
# ---------------------------------------------------------------------------
CANONICAL_TRADEOFF_AFFIXES: List[AffixDefinition] = [
    # 1. Cuồng Bạo Ma Huyết
    AffixDefinition(
        mod_id="curse_blood_frenzy",
        mod_name="[Dị Biến] Cuồng Bạo Ma Huyết (+140% Sát Thương)",
        affix_type=AffixType.PREFIX,
        tier=0,
        required_ilvl=85,
        min_val=130.0,
        max_val=160.0,
        weight=15,
        allowed_slots=ALL_WEAPONS,
        is_downside_affix=True,
        downside_type=DownsidePenaltyType.LIFE_DEGEN_PCT,
        downside_val=5.0,
        downside_desc="Mất 5% Sinh lực tối đa mỗi giây khi đang giao chiến.",
    ),

    # 2. Hư Không Đoạt Hồn
    AffixDefinition(
        mod_id="curse_void_reaper",
        mod_name="[Dị Biến] Hư Không Đoạt Hồn (+75% Bạo Kích Multi, 8% Hút Máu)",
        affix_type=AffixType.SUFFIX,
        tier=0,
        required_ilvl=85,
        min_val=70.0,
        max_val=85.0,
        weight=15,
        allowed_slots=ALL_WEAPONS | {ItemSlot.AMULET},
        is_downside_affix=True,
        downside_type=DownsidePenaltyType.REDUCE_MAX_RES_CAP,
        downside_val=10.0,
        downside_desc="Trần Kháng Ngũ Hành Tối Đa bị giảm 10% (Trần kháng tụt xuống 65%).",
    ),

    # 3. Cương Thiết Bất Hoại
    AffixDefinition(
        mod_id="curse_titan_carapace",
        mod_name="[Dị Biến] Cương Thiết Bất Hoại (+1000 Giáp, -20% Sát Thương Gánh Chịu)",
        affix_type=AffixType.PREFIX,
        tier=0,
        required_ilvl=85,
        min_val=900.0,
        max_val=1200.0,
        weight=15,
        allowed_slots={ItemSlot.BODY_ARMOUR, ItemSlot.SHIELD},
        is_downside_affix=True,
        downside_type=DownsidePenaltyType.CANNOT_EVADE_OR_DASH,
        downside_val=1.0,
        downside_desc="Tốc độ di chuyển -25% và cấm hoàn toàn Thân Pháp Huyễn Ảnh Bộ (Không thể lướt né).",
    ),

    # 4. Thiên Nhãn Thấu Cốt
    AffixDefinition(
        mod_id="curse_blind_predator",
        mod_name="[Dị Biến] Thiên Nhãn Thấu Cốt (Bỏ Qua 100% Giáp & Kháng Quái)",
        affix_type=AffixType.PREFIX,
        tier=0,
        required_ilvl=85,
        min_val=100.0,
        max_val=100.0,
        weight=10,
        allowed_slots=ALL_WEAPONS | {ItemSlot.HELMET},
        is_downside_affix=True,
        downside_type=DownsidePenaltyType.BLIND_AILMENT,
        downside_val=1.0,
        downside_desc="Bản thân vĩnh viễn dính trạng thái Mù (Tầm nhìn giảm 70% và Né tránh giảm 30%).",
    ),

    # 5. Huyết Tế Thần Tướng
    AffixDefinition(
        mod_id="curse_sacrificial_surge",
        mod_name="[Dị Biến] Huyết Tế Thần Tướng (+3 Toàn Bộ Kỹ Năng Ma Võ)",
        affix_type=AffixType.PREFIX,
        tier=0,
        required_ilvl=86,
        min_val=3.0,
        max_val=3.0,
        weight=10,
        allowed_slots={ItemSlot.AMULET, ItemSlot.WEAPON_2H},
        is_downside_affix=True,
        downside_type=DownsidePenaltyType.SKILL_DRAIN_CURRENT_LIFE,
        downside_val=8.0,
        downside_desc="Mọi chiêu thức thi triển tiêu tốn thêm 8% Sinh lực hiện tại.",
    ),

    # 6. Hủy Diệt Cốt Trảo
    AffixDefinition(
        mod_id="curse_brittle_carnage",
        mod_name="[Dị Biến] Hủy Diệt Cốt Trảo (+80% Tốc Độ Tấn Công)",
        affix_type=AffixType.SUFFIX,
        tier=0,
        required_ilvl=85,
        min_val=75.0,
        max_val=85.0,
        weight=12,
        allowed_slots=ALL_WEAPONS | {ItemSlot.GLOVES},
        is_downside_affix=True,
        downside_type=DownsidePenaltyType.TAKE_INCREASED_DMG,
        downside_val=25.0,
        downside_desc="Nhận thêm 25% sát thương từ mọi đòn đánh của kẻ địch.",
    ),
]


# ---------------------------------------------------------------------------
# PINNACLE BOSS & HIGH-TIER MAP MATERIAL DROPS CATALOG
# ---------------------------------------------------------------------------
PINNACLE_MATERIAL_DROPS = {
    "TINH_HUYET_VIEM_QUY": {
        "name": "Tinh Huyết Viêm Quỷ (Flame Demon Core Essence)",
        "source": "Boss Viêm Quỷ Cuồng Nộ (Tầng 100 Cõi Tuyệt Địa Hư Không)",
        "min_monster_level": 85,
        "effect": "Cố định ép thành công dòng T1 Liệt Diễm Thiêu Hồn (70-110 Hỏa) trên phôi vũ khí/trang sức.",
        "prerequisite_quest": "quest_epic_04_van_gioi_than_ma_tranh_ba",
    },
    "TAN_HON_XA_QUAI": {
        "name": "Tàn Hồn Xà Quái (Abyssal Serpent Soul)",
        "source": "Boss Xà Quái Vực Sâu (Tầng 50 Hầm Ngục Phong Thú)",
        "min_monster_level": 75,
        "effect": "Cố định ép thành công dòng T1 Tốc Độ Xuất Chiêu hoặc Thân Pháp Trườn Né.",
        "prerequisite_quest": "quest_epic_01_phong_ma_co_tran",
    },
    "COT_TUY_HAC_LONG": {
        "name": "Cốt Tủy Hắc Long (Black Dragon Fracturing Marrow)",
        "source": "Hoàng Kim Boss Hắc Long Thần Ma (Phong Ma Cổ Trận)",
        "min_monster_level": 80,
        "effect": "Khóa vĩnh viễn 1 dòng thuộc tính ngẫu nhiên thành Cốt Tủy Bất Biến (Fractured Mod, chữ vàng kim).",
        "prerequisite_quest": "quest_epic_01_phong_ma_co_tran",
    },
    "TA_HUYET_DI_BIEN_THACH": {
        "name": "Tà Huyết Dị Biến Thạch (Feral Corruption Stone)",
        "source": "Tứ Đại Bí Thất Man Tộc khi giải mã bia đá trong tình trạng HP < 10%",
        "min_monster_level": 82,
        "effect": "Dị biến tối thượng: 25% Thần Thánh T0 / 25% VỠ NÁT VĨNH VIỄN / 25% Xáo Trộn / 25% Khóa Đồ.",
        "prerequisite_quest": "quest_hidden_01_huyen_anh_to_su",
    },
}


def get_available_affixes(
    slot: ItemSlot,
    affix_type: AffixType,
    item_level: int,
    include_tradeoffs: bool = False,
) -> List[AffixDefinition]:
    """Filters affix pool by slot, type (prefix/suffix), and item level gating."""
    pool = list(CANONICAL_AFFIX_DEFINITIONS)
    if include_tradeoffs:
        pool.extend(CANONICAL_TRADEOFF_AFFIXES)

    available = [
        affix for affix in pool
        if affix.affix_type == affix_type
        and slot in affix.allowed_slots
        and item_level >= affix.required_ilvl
    ]
    return available


def get_tradeoff_affix_by_id(mod_id: str) -> Optional[AffixDefinition]:
    """Finds a specific trade-off affix by its ID."""
    for affix in CANONICAL_TRADEOFF_AFFIXES:
        if affix.mod_id == mod_id:
            return affix
    return None
