"""
Unit Tests for GemManager & POE2 Item Categorization (Doc 63 SSoT)
==================================================================
Kiểm thử các bất biến:
- INV-NO-AUTO-EQUIP-IN-COMBAT: Quản lý kỹ năng theo phím và Weapon Set, không tự ý tráo đổi trong combat.
- Liên kết Support Gems: Tối đa 5 gems cho mỗi Active Skill.
- Phân loại danh mục vật phẩm POE2: Vàng, Currency, Waystones, Uncut Gems, Runes, Soul Cores, Equipment.
"""

import pytest
from src.assistant_tool.gem_manager import (
    GemManager,
    Poe2ActiveSkillLoadout,
    GemCategory,
)
from src.common.item_types import Poe2ItemCategory, classify_poe2_category


def test_gem_manager_default_monk_loadout():
    """Kiểm tra cấu hình mặc định của Monk Martial Artist trong Bảng Kỹ Năng G."""
    manager = GemManager(build_archetype="MONK_MARTIAL_ARTIST")

    # Kiểm tra các phím tắt chính
    skill_q = manager.get_skill_by_key("Q")
    assert skill_q is not None
    assert skill_q.name == "Whirling Assault"
    assert skill_q.weapon_set == 1
    assert "Martial Tempo" in skill_q.support_gems
    assert "Faster Attacks" in skill_q.support_gems

    skill_rmb = manager.get_skill_by_key("rmb")
    assert skill_rmb is not None
    assert skill_rmb.name == "Hollow Form"

    skill_r = manager.get_skill_by_key("R")
    assert skill_r is not None
    assert skill_r.name == "Hollow Focus"

    skill_t = manager.get_skill_by_key("T")
    assert skill_t is not None
    assert skill_t.name == "Tempest Bell"


def test_gem_manager_support_gem_linking_limit():
    """Kiểm tra giới hạn gắn tối đa 5 Support Gems cho mỗi Active Skill."""
    manager = GemManager(build_archetype="MONK_MARTIAL_ARTIST")
    skill_q = manager.get_skill_by_key("Q")
    assert len(skill_q.support_gems) == 2

    # Gắn thêm 3 gems -> đủ 5
    assert manager.link_support_gem("Whirling Assault", "Brutality Support") is True
    assert manager.link_support_gem("Whirling Assault", "Melee Physical Damage") is True
    assert manager.link_support_gem("Whirling Assault", "Increased Critical Strikes") is True
    assert len(skill_q.support_gems) == 5

    # Gắn gem thứ 6 -> Bị từ chối
    assert manager.link_support_gem("Whirling Assault", "Overcharge Support") is False
    assert len(skill_q.support_gems) == 5

    # Gắn gem trùng lặp -> Bị từ chối
    assert manager.link_support_gem("Whirling Assault", "Martial Tempo") is False


def test_gem_manager_weapon_set_compatibility():
    """Kiểm tra tính tương thích giữa Kỹ năng và Weapon Set (1 hoặc 2)."""
    manager = GemManager(build_archetype="MONK_MARTIAL_ARTIST")

    # Thêm 1 kỹ năng gán cho Weapon Set 2
    manager.bind_active_skill(Poe2ActiveSkillLoadout(
        name="Frost Wall", key_binding="W", weapon_set=2, role="PRIMER"
    ))

    # Kỹ năng Set 1 khả dụng khi đang ở Weapon Set 1
    assert manager.is_skill_available("Whirling Assault", current_weapon_set=1) is True
    assert manager.is_skill_available("Whirling Assault", current_weapon_set=2) is False

    # Kỹ năng Set 2 khả dụng khi đang ở Weapon Set 2
    assert manager.is_skill_available("Frost Wall", current_weapon_set=2) is True
    assert manager.is_skill_available("Frost Wall", current_weapon_set=1) is False

    # Danh sách kỹ năng theo Weapon Set
    skills_set1 = manager.get_skills_for_weapon_set(1)
    assert any(s.name == "Whirling Assault" for s in skills_set1)
    assert not any(s.name == "Frost Wall" for s in skills_set1)

    skills_set2 = manager.get_skills_for_weapon_set(2)
    assert any(s.name == "Frost Wall" for s in skills_set2)
    assert not any(s.name == "Whirling Assault" for s in skills_set2)


def test_poe2_item_classification_accuracy():
    """Kiểm tra phân loại chính xác các danh mục vật phẩm đặc thù của POE2."""
    assert classify_poe2_category("Gold") == Poe2ItemCategory.GOLD
    assert classify_poe2_category("Waystone (Tier 15)") == Poe2ItemCategory.WAYSTONE
    assert classify_poe2_category("Precursor Tablet") == Poe2ItemCategory.PRECURSOR_TABLET
    assert classify_poe2_category("Uncut Skill Gem (Level 19)") == Poe2ItemCategory.UNCUT_SKILL_GEM
    assert classify_poe2_category("Uncut Support Gem (Level 3)") == Poe2ItemCategory.UNCUT_SUPPORT_GEM
    assert classify_poe2_category("Uncut Spirit Gem") == Poe2ItemCategory.UNCUT_SPIRIT_GEM
    assert classify_poe2_category("Iron Rune") == Poe2ItemCategory.RUNE
    assert classify_poe2_category("Soul Core of Tacati") == Poe2ItemCategory.SOUL_CORE
    assert classify_poe2_category("Thawing Charm") == Poe2ItemCategory.CHARM
    assert classify_poe2_category("Divine Orb") == Poe2ItemCategory.CURRENCY
    assert classify_poe2_category("Chaos Orb") == Poe2ItemCategory.CURRENCY
    assert classify_poe2_category("Expert Vaal Cuirass") == Poe2ItemCategory.EQUIPMENT
    assert classify_poe2_category("Spiked Fists") == Poe2ItemCategory.EQUIPMENT
    assert classify_poe2_category("Crescent Quarterstaff") == Poe2ItemCategory.EQUIPMENT
