"""
FreeExile Standard Weapon Base Catalog.
Contains canonical base weapon templates tailored for:
5 Savage Sects (Thanh Phong, U Minh, Hàn Băng, Liệt Diễm, Kim Cang)
5 Primal Clans (Crimson Blood, Gale Phantom, Nether Wraith, Frost Feral, Earth Titan)
"""

from typing import Dict, List
try:
    from server.world.martial_types import FiveElements, MartialSect, WeaponCategory
    from server.world.weapon_types import (
        WeaponClass,
        GripStyle,
        PrimalClan,
        WeaponImplicitStat,
        WeaponImplicitMod,
        BaseWeaponTemplate,
    )
except ImportError:
    from world.martial_types import FiveElements, MartialSect, WeaponCategory
    from world.weapon_types import (
        WeaponClass,
        GripStyle,
        PrimalClan,
        WeaponImplicitStat,
        WeaponImplicitMod,
        BaseWeaponTemplate,
    )



def _bwt(
    wid: str, nvi: str, nen: str, wcls: WeaponClass, cat: WeaponCategory,
    grip: GripStyle, sect: MartialSect, clan: PrimalClan, elem: FiveElements,
    lvl: int, p: int, a: int, m: int, dmin: float, dmax: float,
    aps: float, crit: float, rng: float,
    istat: WeaponImplicitStat, ival: float, idesc: str,
    edmin: float = 0.0, edmax: float = 0.0
) -> BaseWeaponTemplate:
    """Helper compact khởi tạo BaseWeaponTemplate chuẩn hóa."""
    return BaseWeaponTemplate(
        weapon_id=wid, name_vi=nvi, name_en=nen, weapon_class=wcls, category=cat,
        grip_style=grip, sect_affinity=sect, clan_affinity=clan, element=elem,
        required_level=lvl, req_physique=p, req_agility=a, req_mind=m,
        min_damage=dmin, max_damage=dmax, elemental_min_damage=edmin,
        elemental_max_damage=edmax, attacks_per_second=aps, base_crit_chance=crit,
        weapon_range_meters=rng,
        implicit_mod=WeaponImplicitMod(stat=istat, value=ival, description=idesc)
    )


def create_base_weapon_catalog() -> Dict[str, BaseWeaponTemplate]:
    """Khởi tạo từ điển toàn bộ các phôi vũ khí tiêu chuẩn trong FreeExile."""
    c: Dict[str, BaseWeaponTemplate] = {}

    # 1. THANH PHONG KIẾM TÔNG & GALE PHANTOM (KIM / THÂN PHÁP / LÔI ĐIỆN)
    c["WPN_SWORD_1H_COT_KIEM"] = _bwt(
        "WPN_SWORD_1H_COT_KIEM", "Cốt Kiếm Gai", "Spined Bone Sword",
        WeaponClass.SWORD, WeaponCategory.SWORD, GripStyle.ONE_HANDED,
        MartialSect.THANH_PHONG, PrimalClan.GALE_PHANTOM, FiveElements.KIM,
        1, 15, 35, 10, 18.0, 36.0, 1.45, 0.075, 1.5,
        WeaponImplicitStat.GLOBAL_CRIT_CHANCE, 0.25, "+25% Tỉ lệ Bạo Kích toàn cục", 5.0, 12.0
    )
    c["WPN_SWORD_1H_THANH_PHONG"] = _bwt(
        "WPN_SWORD_1H_THANH_PHONG", "Đoản Kiếm Thanh Phong", "Gale Phantom Dagger",
        WeaponClass.SWORD, WeaponCategory.SWORD, GripStyle.ONE_HANDED,
        MartialSect.THANH_PHONG, PrimalClan.GALE_PHANTOM, FiveElements.KIM,
        35, 25, 75, 20, 42.0, 78.0, 1.55, 0.085, 1.4,
        WeaponImplicitStat.GLOBAL_CRIT_MULTIPLIER, 0.30, "+30% Sát Thương Bạo Kích toàn cục", 15.0, 35.0
    )
    c["WPN_SWORD_2H_CO_KIEM"] = _bwt(
        "WPN_SWORD_2H_CO_KIEM", "Cổ Kiếm Lôi Kình", "Ancient Thunder Greatsword",
        WeaponClass.SWORD, WeaponCategory.SWORD, GripStyle.TWO_HANDED,
        MartialSect.THANH_PHONG, PrimalClan.GALE_PHANTOM, FiveElements.KIM,
        60, 60, 110, 40, 125.0, 235.0, 1.20, 0.065, 2.2,
        WeaponImplicitStat.LIGHTNING_PENETRATION, 0.20, "+20% Xuyên Kháng Lôi Điện", 45.0, 95.0
    )
    c["WPN_SWORD_1H_TAN_VO"] = _bwt(
        "WPN_SWORD_1H_TAN_VO", "Tàn Kiếm Rỉ Sét", "Rusted Shard Blade",
        WeaponClass.SWORD, WeaponCategory.SWORD, GripStyle.ONE_HANDED,
        MartialSect.THANH_PHONG, PrimalClan.GALE_PHANTOM, FiveElements.KIM,
        1, 10, 20, 5, 12.0, 24.0, 1.35, 0.06, 1.5,
        WeaponImplicitStat.GLOBAL_CRIT_CHANCE, 0.15, "+15% Tỉ lệ Bạo Kích toàn cục"
    )

    # 2. LIỆT DIỄM CUỒNG ĐAO & CRIMSON BLOOD (HỎA / CƯƠNG THỂ / CUỒNG SÁT)
    c["WPN_BLADE_2H_XICH_HUYET"] = _bwt(
        "WPN_BLADE_2H_XICH_HUYET", "Xích Huyết Trọng Đao", "Crimson Blood Great Cleaver",
        WeaponClass.BLADE, WeaponCategory.BLADE, GripStyle.TWO_HANDED,
        MartialSect.LIET_DIEM, PrimalClan.CRIMSON_BLOOD, FiveElements.HOA,
        45, 110, 40, 15, 140.0, 280.0, 1.05, 0.05, 2.3,
        WeaponImplicitStat.FIRE_PENETRATION, 0.25, "+25% Xuyên Kháng Hỏa Diễm", 50.0, 110.0
    )
    c["WPN_BLADE_1H_CUONG_PHU"] = _bwt(
        "WPN_BLADE_1H_CUONG_PHU", "Cuồng Sát Tà Phủ", "Berserker Handaxe",
        WeaponClass.BLADE, WeaponCategory.BLADE, GripStyle.ONE_HANDED,
        MartialSect.LIET_DIEM, PrimalClan.CRIMSON_BLOOD, FiveElements.HOA,
        25, 65, 35, 10, 36.0, 72.0, 1.30, 0.055, 1.6,
        WeaponImplicitStat.MELEE_BLEED_CHANCE, 0.30, "+30% Cơ hội gây Xuất Huyết xé thịt"
    )
    c["WPN_BLADE_2H_TRAM_MA"] = _bwt(
        "WPN_BLADE_2H_TRAM_MA", "Trảm Mã Cự Đao", "Horse-Beheading Greatblade",
        WeaponClass.BLADE, WeaponCategory.BLADE, GripStyle.TWO_HANDED,
        MartialSect.LIET_DIEM, PrimalClan.CRIMSON_BLOOD, FiveElements.HOA,
        70, 150, 50, 20, 210.0, 390.0, 0.95, 0.05, 2.5,
        WeaponImplicitStat.SLAM_AOE_RADIUS_BONUS, 0.30, "+30% Bán kính vụ nổ Slam nện đất", 75.0, 160.0
    )
    c["WPN_BLADE_1H_XE_THIT"] = _bwt(
        "WPN_BLADE_1H_XE_THIT", "Cốt Đao Xé Thịt", "Flesh-Ripping Bone Blade",
        WeaponClass.BLADE, WeaponCategory.BLADE, GripStyle.ONE_HANDED,
        MartialSect.LIET_DIEM, PrimalClan.CRIMSON_BLOOD, FiveElements.HOA,
        1, 25, 15, 5, 16.0, 34.0, 1.25, 0.05, 1.5,
        WeaponImplicitStat.MELEE_BLEED_CHANCE, 0.20, "+20% Cơ hội gây Xuất Huyết"
    )

    # 3. HÀN BĂNG THẦN ĐIỆN & FROST FERAL (THỦY / THẦN THỨC / BĂNG HÀN)
    c["WPN_STAFF_2H_BANG_TINH"] = _bwt(
        "WPN_STAFF_2H_BANG_TINH", "Băng Tinh Pháp Trượng", "Glacial Crystal Staff",
        WeaponClass.STAFF, WeaponCategory.STAFF, GripStyle.TWO_HANDED,
        MartialSect.HAN_BANG, PrimalClan.FROST_FERAL, FiveElements.THUY,
        50, 35, 30, 120, 85.0, 160.0, 1.15, 0.07, 1.8,
        WeaponImplicitStat.COLD_PENETRATION, 0.25, "+25% Xuyên Kháng Băng Hàn", 60.0, 130.0
    )
    c["WPN_STAFF_1H_BANG_LUAN"] = _bwt(
        "WPN_STAFF_1H_BANG_LUAN", "Băng Luân Cốt Chùy", "Frost Orb Scepter",
        WeaponClass.STAFF, WeaponCategory.STAFF, GripStyle.ONE_HANDED,
        MartialSect.HAN_BANG, PrimalClan.FROST_FERAL, FiveElements.THUY,
        30, 25, 25, 70, 30.0, 62.0, 1.25, 0.06, 1.5,
        WeaponImplicitStat.MAX_WARD_BONUS, 0.20, "+20% Trần Hộ Thể (Max Ward Barrier)", 25.0, 55.0
    )
    c["WPN_STAFF_2H_VU_TRUNG"] = _bwt(
        "WPN_STAFF_2H_VU_TRUNG", "Vu Trùng Cốt Trượng", "Wraith Parasite Bone Staff",
        WeaponClass.STAFF, WeaponCategory.STAFF, GripStyle.TWO_HANDED,
        MartialSect.U_MINH, PrimalClan.NETHER_WRAITH, FiveElements.MOC,
        55, 30, 50, 115, 75.0, 145.0, 1.10, 0.065, 1.8,
        WeaponImplicitStat.POISON_DOT_MULTIPLIER, 0.35, "+35% Sát Thương Độc Tố DoT", 50.0, 110.0
    )
    c["WPN_STAFF_1H_MA_PHAP"] = _bwt(
        "WPN_STAFF_1H_MA_PHAP", "Ma Pháp Cốt Súc", "Crude Shaman Bone Wand",
        WeaponClass.STAFF, WeaponCategory.STAFF, GripStyle.ONE_HANDED,
        MartialSect.HAN_BANG, PrimalClan.FROST_FERAL, FiveElements.THUY,
        1, 10, 10, 25, 14.0, 28.0, 1.20, 0.06, 1.5,
        WeaponImplicitStat.MAX_WARD_BONUS, 0.15, "+15% Trần Hộ Thể (Max Ward)", 8.0, 18.0
    )

    # 4. KIM CANG MAN BINH & EARTH TITAN (THỔ / CƯƠNG THỂ / ĐỊA CHẤN)
    c["WPN_CLUB_2H_HUYEN_THIET"] = _bwt(
        "WPN_CLUB_2H_HUYEN_THIET", "Huyền Thiết Bổng", "Black Iron War Club",
        WeaponClass.BLUNT_HAMMER, WeaponCategory.STAFF, GripStyle.TWO_HANDED,
        MartialSect.KIM_CANG, PrimalClan.EARTH_TITAN, FiveElements.THO,
        40, 105, 25, 25, 130.0, 260.0, 1.00, 0.05, 2.1,
        WeaponImplicitStat.STUN_THRESHOLD_REDUCTION, 0.25, "-25% Ngưỡng kháng Choáng của kẻ địch"
    )
    c["WPN_CLUB_2H_PHA_SON"] = _bwt(
        "WPN_CLUB_2H_PHA_SON", "Phá Sơn Cự Chùy", "Mountain-Breaker Titan Maul",
        WeaponClass.BLUNT_HAMMER, WeaponCategory.STAFF, GripStyle.TWO_HANDED,
        MartialSect.KIM_CANG, PrimalClan.EARTH_TITAN, FiveElements.THO,
        65, 145, 20, 35, 195.0, 375.0, 0.90, 0.05, 2.4,
        WeaponImplicitStat.STUN_DURATION_BONUS, 0.40, "+40% Thời gian duy trì Choáng váng"
    )
    c["WPN_CLUB_1H_COT_CHUY"] = _bwt(
        "WPN_CLUB_1H_COT_CHUY", "Cốt Chùy Nanh Thú", "Beast-Fang Bone Mace",
        WeaponClass.BLUNT_HAMMER, WeaponCategory.STAFF, GripStyle.ONE_HANDED,
        MartialSect.KIM_CANG, PrimalClan.EARTH_TITAN, FiveElements.THO,
        15, 45, 15, 10, 28.0, 58.0, 1.20, 0.05, 1.6,
        WeaponImplicitStat.STUN_THRESHOLD_REDUCTION, 0.15, "-15% Ngưỡng kháng Choáng"
    )
    c["WPN_CLUB_2H_DIA_CHAN"] = _bwt(
        "WPN_CLUB_2H_DIA_CHAN", "Địa Chấn Man Bổng", "Earthquake Savage Staff",
        WeaponClass.BLUNT_HAMMER, WeaponCategory.STAFF, GripStyle.TWO_HANDED,
        MartialSect.KIM_CANG, PrimalClan.EARTH_TITAN, FiveElements.THO,
        1, 30, 10, 10, 22.0, 46.0, 1.05, 0.05, 2.0,
        WeaponImplicitStat.SLAM_AOE_RADIUS_BONUS, 0.25, "+25% Bán kính vụ nổ Slam nện đất"
    )

    # 5. U MINH ĐỘC Y & NETHER WRAITH (MỘC / THÂN-THẦN / ĐỘC TỐ & ÁM KHÍ)
    c["WPN_BOW_2H_COT_TIEN"] = _bwt(
        "WPN_BOW_2H_COT_TIEN", "Cốt Tiễn Cung", "Corpse-Spine Bone Bow",
        WeaponClass.RANGED_BOW, WeaponCategory.PROJECTILE_WEAPON, GripStyle.TWO_HANDED,
        MartialSect.U_MINH, PrimalClan.NETHER_WRAITH, FiveElements.MOC,
        35, 20, 70, 50, 48.0, 98.0, 1.35, 0.07, 14.0,
        WeaponImplicitStat.ADDITIONAL_PIERCE, 1.0, "Đạn đạo đâm xuyên thêm +1 mục tiêu", 20.0, 45.0
    )
    c["WPN_BOW_1H_PHI_CHAM"] = _bwt(
        "WPN_BOW_1H_PHI_CHAM", "Độc Nha Phi Châm", "Venom-Tooth Needles",
        WeaponClass.RANGED_BOW, WeaponCategory.PROJECTILE_WEAPON, GripStyle.ONE_HANDED,
        MartialSect.U_MINH, PrimalClan.NETHER_WRAITH, FiveElements.MOC,
        20, 15, 50, 35, 22.0, 45.0, 1.60, 0.075, 10.0,
        WeaponImplicitStat.POISON_DOT_MULTIPLIER, 0.25, "+25% Sát Thương Độc Tố DoT", 12.0, 28.0
    )
    c["WPN_BOW_2H_NO_SAN"] = _bwt(
        "WPN_BOW_2H_NO_SAN", "Nỏ Săn Thô Ráp", "Crude Savage Crossbow",
        WeaponClass.RANGED_BOW, WeaponCategory.PROJECTILE_WEAPON, GripStyle.TWO_HANDED,
        MartialSect.THANH_PHONG, PrimalClan.GALE_PHANTOM, FiveElements.KIM,
        55, 45, 100, 25, 85.0, 175.0, 1.15, 0.08, 16.0,
        WeaponImplicitStat.ADDITIONAL_PIERCE, 2.0, "Đạn đạo đâm xuyên thêm +2 mục tiêu"
    )
    c["WPN_BOW_1H_AM_KHI"] = _bwt(
        "WPN_BOW_1H_AM_KHI", "Ma Tiễn Ám Khí", "Wraith Throwing Dart",
        WeaponClass.RANGED_BOW, WeaponCategory.PROJECTILE_WEAPON, GripStyle.ONE_HANDED,
        MartialSect.U_MINH, PrimalClan.NETHER_WRAITH, FiveElements.MOC,
        1, 10, 25, 15, 12.0, 26.0, 1.50, 0.065, 9.0,
        WeaponImplicitStat.POISON_DOT_MULTIPLIER, 0.15, "+15% Sát Thương Độc Tố DoT"
    )

    # 6. MÓNG VUỐT & QUYỀN CỐT (FERAL CLAW)
    c["WPN_CLAW_1H_GAI_THU"] = _bwt(
        "WPN_CLAW_1H_GAI_THU", "Cốt Trảo Gai Dã Thú", "Feral Spined Bone Claw",
        WeaponClass.FERAL_CLAW, WeaponCategory.UNARMED, GripStyle.ONE_HANDED,
        MartialSect.KIM_CANG, PrimalClan.EARTH_TITAN, FiveElements.THO,
        25, 55, 40, 15, 30.0, 60.0, 1.65, 0.08, 1.3,
        WeaponImplicitStat.LIFE_ON_HIT, 15.0, "Hồi phục +15 Khí Huyết mỗi đòn đánh trúng"
    )
    c["WPN_CLAW_1H_QUYEN_COT"] = _bwt(
        "WPN_CLAW_1H_QUYEN_COT", "Quyền Cốt Huyết Lang", "Bloodwolf Bone Fist",
        WeaponClass.FERAL_CLAW, WeaponCategory.UNARMED, GripStyle.ONE_HANDED,
        MartialSect.LIET_DIEM, PrimalClan.CRIMSON_BLOOD, FiveElements.HOA,
        45, 85, 60, 20, 65.0, 125.0, 1.70, 0.085, 1.3,
        WeaponImplicitStat.LIFE_ON_HIT, 20.0, "Hồi phục +20 Khí Huyết mỗi đòn đánh trúng"
    )

    # 7. HỘ THÂN THUẪN & CỐT BÀI (SHIELDS)
    c["WPN_SHIELD_HAC_BI_THUAN"] = _bwt(
        "WPN_SHIELD_HAC_BI_THUAN", "Hắc Bì Huyết Thuẫn", "Black Hide Blood Shield",
        WeaponClass.SHIELD, WeaponCategory.ANY, GripStyle.OFFHAND_SHIELD,
        MartialSect.KIM_CANG, PrimalClan.CRIMSON_BLOOD, FiveElements.THO,
        30, 70, 20, 10, 0.0, 0.0, 1.0, 0.0, 1.0,
        WeaponImplicitStat.BLOCK_CHANCE, 0.28, "+28% Tỉ lệ Chặn Đòn (Block Chance)"
    )
    c["WPN_SHIELD_BANG_COT"] = _bwt(
        "WPN_SHIELD_BANG_COT", "Băng Cốt Tà Thuẫn", "Frost Bone Ward Shield",
        WeaponClass.SHIELD, WeaponCategory.ANY, GripStyle.OFFHAND_SHIELD,
        MartialSect.HAN_BANG, PrimalClan.FROST_FERAL, FiveElements.THUY,
        40, 35, 25, 80, 0.0, 0.0, 1.0, 0.0, 1.0,
        WeaponImplicitStat.BLOCK_CHANCE, 0.24, "+24% Tỉ lệ Chặn Đòn, +100 Hộ Thể Ward"
    )
    c["WPN_SHIELD_PHONG_MOC"] = _bwt(
        "WPN_SHIELD_PHONG_MOC", "Phong Giáp Mộc Bài", "Gale Wooden Buckler",
        WeaponClass.SHIELD, WeaponCategory.ANY, GripStyle.OFFHAND_SHIELD,
        MartialSect.THANH_PHONG, PrimalClan.GALE_PHANTOM, FiveElements.KIM,
        15, 20, 40, 10, 0.0, 0.0, 1.0, 0.0, 1.0,
        WeaponImplicitStat.BLOCK_CHANCE, 0.22, "+22% Tỉ lệ Chặn Đòn"
    )

    # 8. NGŨ ĐẠI HOANG THẦN THẦN BINH (SAVAGE PRIMAL DIVINE RELIC WEAPONS)
    c["WPN_DIVINE_SWORD_XICH_HUYET"] = _bwt(
        "WPN_DIVINE_SWORD_XICH_HUYET", "Xích Huyết Trảm Ma Cự Kiếm", "Abyssal Chainguard Greatsword",
        WeaponClass.BLADE, WeaponCategory.BLADE, GripStyle.TWO_HANDED,
        MartialSect.LIET_DIEM, PrimalClan.CRIMSON_BLOOD, FiveElements.HOA,
        85, 180, 70, 30, 260.0, 480.0, 1.10, 0.08, 2.6,
        WeaponImplicitStat.FIRE_PENETRATION, 0.35, "+35% Xuyên Kháng Hỏa, +40% Xuất Huyết xé thịt", 110.0, 240.0
    )
    c["WPN_DIVINE_AXE_THON_COT"] = _bwt(
        "WPN_DIVINE_AXE_THON_COT", "Thôn Cốt Long Ngạc Cự Phủ", "Dragonbone Maw Greataxe",
        WeaponClass.BLADE, WeaponCategory.BLADE, GripStyle.TWO_HANDED,
        MartialSect.KIM_CANG, PrimalClan.EARTH_TITAN, FiveElements.THO,
        85, 210, 45, 25, 290.0, 540.0, 0.95, 0.065, 2.5,
        WeaponImplicitStat.SLAM_AOE_RADIUS_BONUS, 0.45, "+45% Bán kính vụ nổ Slam nện đất, Nghiền nát giáp 30%", 130.0, 280.0
    )
    c["WPN_DIVINE_BOW_TICH_COT"] = _bwt(
        "WPN_DIVINE_BOW_TICH_COT", "Tích Cốt Ma Hồn Cung", "Spinal Recurve Greatbow",
        WeaponClass.RANGED_BOW, WeaponCategory.PROJECTILE_WEAPON, GripStyle.TWO_HANDED,
        MartialSect.U_MINH, PrimalClan.NETHER_WRAITH, FiveElements.MOC,
        85, 60, 195, 80, 180.0, 340.0, 1.40, 0.095, 18.0,
        WeaponImplicitStat.ADDITIONAL_PIERCE, 3.0, "Đạn đạo đâm xuyên +3 mục tiêu, +50% Độc Tố DoT", 90.0, 190.0
    )
    c["WPN_DIVINE_SPEAR_THAN_PHU"] = _bwt(
        "WPN_DIVINE_SPEAR_THAN_PHU", "Thần Phù Tế Cốt Kích", "Runic Skullspear Halberd",
        WeaponClass.SWORD, WeaponCategory.SWORD, GripStyle.TWO_HANDED,
        MartialSect.THANH_PHONG, PrimalClan.GALE_PHANTOM, FiveElements.KIM,
        85, 80, 170, 70, 220.0, 410.0, 1.30, 0.09, 3.0,
        WeaponImplicitStat.LIGHTNING_PENETRATION, 0.35, "+35% Xuyên Kháng Lôi Điện, +40% Bạo Kích", 100.0, 210.0
    )
    c["WPN_DIVINE_STAFF_THAI_HU"] = _bwt(
        "WPN_DIVINE_STAFF_THAI_HU", "Thái Hư Hủ Hồn Ma Trượng", "Etheric Demonstaff",
        WeaponClass.STAFF, WeaponCategory.STAFF, GripStyle.TWO_HANDED,
        MartialSect.HAN_BANG, PrimalClan.FROST_FERAL, FiveElements.THUY,
        85, 50, 60, 220, 160.0, 310.0, 1.25, 0.085, 2.2,
        WeaponImplicitStat.MAX_WARD_BONUS, 0.40, "+40% Trần Hộ Thể (Max Ward), +35% Xuyên Băng Hàn", 140.0, 300.0
    )

    return c


_BASE_CATALOG_CACHE: Dict[str, BaseWeaponTemplate] = create_base_weapon_catalog()


def get_base_weapon_catalog() -> Dict[str, BaseWeaponTemplate]:
    """Lấy danh mục phôi vũ khí tiêu chuẩn."""
    return _BASE_CATALOG_CACHE


def get_weapons_by_sect(sect: MartialSect) -> List[BaseWeaponTemplate]:
    """Lọc danh sách vũ khí phù hợp với môn phái cụ thể."""
    return [w for w in _BASE_CATALOG_CACHE.values() if w.sect_affinity == sect]


def get_weapons_by_clan(clan: PrimalClan) -> List[BaseWeaponTemplate]:
    """Lọc danh sách vũ khí phù hợp với dòng máu tộc hệ man hoang."""
    return [w for w in _BASE_CATALOG_CACHE.values() if w.clan_affinity == clan]
