"""AutoPOE2 - Test Suite Thẩm Định Tooltip Vật Phẩm & Phân Loại Tier (Doc 29 / Doc 68).
=====================================================================================
Kiểm thử toàn diện:
1. Thẩm định Áo Giáp Hiếm Thần Phẩm (T1 Life + Dual T1 Res) -> Phân loại KEEP.
2. Thẩm định Dây Chuyền +Skill Gems (+2 Spell Skill Gems, Crit Multi) -> Phân loại KEEP.
3. Thẩm định Giày Tốc Độ Chạy T1 (35% MS, 14% Spell Suppress) -> Phân loại KEEP/STASH.
4. Thẩm định Nhẫn Chí Mạng & Kháng Hỗn Loạn (Crit Multi, Chaos Res) -> Phân loại STASH.
5. Thẩm định Vũ Khí Sát Thương Vật Lý Cao (%Phys, Flat Phys, Attack Speed) -> Phân loại KEEP.
6. Thẩm định Trang Bị Rác / Thuộc Tính Kém (Light Radius, Thorns, Mana) -> Phân loại VENDOR.
7. Thẩm định trực tiếp từ Artifact Ảnh Chụp Thật (captures/test_auto_hover_success.png).
8. Kháng lỗi và an toàn tuyệt đối khi gặp dữ liệu trống hoặc sai định dạng.

Tuân thủ nghiêm ngặt:
- Rule 5: Sử dụng artifact thật từ captures/.
- Rule 14: Quality Gate, 100% tests PASS.
"""

from __future__ import annotations

import os
import unittest
from PIL import Image

from src.assistant_tool.pickit.item_tooltip_evaluator import (
    ItemEvaluationAction,
    ItemEvaluationReport,
    ItemTooltipEvaluator,
)
from src.assistant_tool.pickit.mod_tier_patterns import ModCategory


class TestItemTooltipEvaluator(unittest.TestCase):
    """Test suite kiểm thử ItemTooltipEvaluator."""

    def setUp(self) -> None:
        self.evaluator = ItemTooltipEvaluator()
        self.captures_dir = os.path.join(os.path.dirname(__file__), "..", "captures")

    def test_tier_1_life_and_high_resistances_body_armour_keep(self) -> None:
        """Kiểm chứng áo giáp hiếm T1 Life + Dual T1 Resists đạt KEEP với điểm hiệp đồng cao."""
        body_armour_text = """Item Class: Body Armours
Rarity: Rare
Morbid Carapace
Expert Iron Cuirass
--------
Armour: 540 (augmented)
--------
Requirements:
Level: 65
Str: 120
--------
Sockets: S S S
--------
Item Level: 82
--------
+115 to maximum Life
+350 to Armour
+44% to Fire Resistance
+42% to Lightning Resistance"""

        report = self.evaluator.evaluate_text(body_armour_text)

        self.assertEqual(report.action, ItemEvaluationAction.KEEP)
        self.assertEqual(report.item_class, "Body Armours")
        self.assertEqual(report.rarity, "RARE")
        self.assertEqual(report.item_level, 82)
        self.assertGreaterEqual(report.tier_1_count, 3)  # T1 Life, T1 Fire Res, T1 Lightning Res
        self.assertGreaterEqual(report.total_score, 70.0)

        # Kiểm tra Pseudo Resistances
        self.assertAlmostEqual(report.pseudo_resists.get("fire", 0.0), 44.0)
        self.assertAlmostEqual(report.pseudo_resists.get("lightning", 0.0), 42.0)
        self.assertGreaterEqual(report.pseudo_resists.get("total_ele", 0.0), 86.0)

        # Kiểm tra hiệp đồng
        self.assertTrue(any("Life + Multi Resistance" in s for s in report.synergy_bonuses))

    def test_plus_skill_gems_amulet_keep(self) -> None:
        """Kiểm chứng dây chuyền có +Skill Gems phân loại KEEP và ghi điểm vượt trội."""
        amulet_text = """Item Class: Amulets
Rarity: Rare
Sol Rosary
Amber Amulet
--------
Requirements:
Level: 68
--------
Item Level: 84
--------
+2 to Level of all Spell Skill Gems
+24% to Global Critical Strike Multiplier
+38% to Cold Resistance
+75 to maximum Life"""

        report = self.evaluator.evaluate_text(amulet_text)

        self.assertEqual(report.action, ItemEvaluationAction.KEEP)
        self.assertGreaterEqual(report.total_score, 70.0)

        # Kiểm tra dòng +2 Spell Skill Gems
        gems_mods = [m for m in report.high_value_mods if m.category == ModCategory.SKILL_GEMS]
        self.assertEqual(len(gems_mods), 1)
        self.assertEqual(gems_mods[0].value, 2.0)
        self.assertTrue(gems_mods[0].is_tier_1)
        self.assertGreaterEqual(gems_mods[0].score, 60.0)

    def test_boots_movement_speed_and_spell_suppress(self) -> None:
        """Kiểm chứng giày có T1 Movement Speed (35%) và Spell Suppression đạt chuẩn cao."""
        boots_text = """Item Class: Boots
Rarity: Rare
Storm Stride
Expert Wrapped Boots
--------
Evasion Rating: 280
--------
Requirements:
Level: 65
Dex: 110
--------
Item Level: 80
--------
+35% increased Movement Speed
+14% chance to Suppress Spell Damage
+38% to Cold Resistance"""

        report = self.evaluator.evaluate_text(boots_text)

        self.assertIn(report.action, (ItemEvaluationAction.KEEP, ItemEvaluationAction.STASH))
        self.assertGreaterEqual(report.tier_1_count, 2)  # MS 35% (T1), Suppress 14% (T1)

        # Kiểm tra danh sách high value mods
        categories = {m.category for m in report.high_value_mods}
        self.assertIn(ModCategory.MOVE_SPEED, categories)
        self.assertIn(ModCategory.SPELL_SUPPRESSION, categories)

    def test_ring_crit_multi_and_chaos_res_stash(self) -> None:
        """Kiểm chứng nhẫn có Crit Multi và Chaos Res giá trị cao đạt chuẩn STASH."""
        ring_text = """Item Class: Rings
Rarity: Rare
Doom Spiral
Diamond Ring
--------
Requirements:
Level: 60
--------
Item Level: 78
--------
+24% to Global Critical Strike Multiplier
+22% to Chaos Resistance
+75 to maximum Life"""

        report = self.evaluator.evaluate_text(ring_text)

        self.assertIn(report.action, (ItemEvaluationAction.KEEP, ItemEvaluationAction.STASH))
        self.assertGreaterEqual(report.total_score, 40.0)
        self.assertAlmostEqual(report.pseudo_resists.get("chaos", 0.0), 22.0)

    def test_weapon_physical_dps_evaluation(self) -> None:
        """Kiểm chứng vũ khí vật lý ba dòng sát thương đạt chuẩn KEEP."""
        weapon_text = """Item Class: Two Hand Swords
Rarity: Rare
Beast Cleaver
Colossus Sword
--------
Item Level: 83
--------
145% increased Physical Damage
Adds 18 to 36 Physical Damage
18% increased Attack Speed"""

        report = self.evaluator.evaluate_text(weapon_text)

        self.assertEqual(report.action, ItemEvaluationAction.KEEP)
        self.assertGreaterEqual(report.tier_1_count, 3)
        self.assertGreaterEqual(report.total_score, 70.0)

    def test_junk_item_vendor_decision(self) -> None:
        """Kiểm chứng trang bị rác chỉ số thấp / không hiệp đồng bị phân loại VENDOR."""
        junk_text = """Item Class: Body Armours
Rarity: Rare
Trash Mail
Rusty Chest
--------
Item Level: 45
--------
12% increased Light Radius
Reflects 4 Physical Damage to Melee Attackers
+18 to maximum Mana
+12% to Fire Resistance"""

        report = self.evaluator.evaluate_text(junk_text)

        self.assertEqual(report.action, ItemEvaluationAction.VENDOR)
        self.assertLess(report.total_score, 40.0)
        self.assertEqual(report.tier_1_count, 0)
        self.assertTrue(any("vendor" in r.lower() or "low" in r.lower() for r in report.reasons))

    def test_real_capture_image_evaluation(self) -> None:
        """Kiểm thử thẩm định trực tiếp từ ảnh capture thực tế (captures/test_auto_hover_success.png)."""
        real_img_path = os.path.join(self.captures_dir, "test_auto_hover_success.png")
        if not os.path.exists(real_img_path):
            self.skipTest("Không tìm thấy captures/test_auto_hover_success.png")

        report = self.evaluator.evaluate_image(real_img_path)

        self.assertIsInstance(report, ItemEvaluationReport)
        self.assertIn(report.action, (ItemEvaluationAction.KEEP, ItemEvaluationAction.STASH, ItemEvaluationAction.VENDOR))
        # Ảnh chụp test_auto_hover_success có tooltip Waystone Drop Chance +70%
        self.assertGreater(len(report.raw_text), 0)

    def test_empty_or_malformed_input_fail_safe(self) -> None:
        """Kiểm chứng an toàn tuyệt đối, không crash khi gặp chuỗi rỗng hoặc rác."""
        empty_report = self.evaluator.evaluate_text("")
        self.assertEqual(empty_report.action, ItemEvaluationAction.VENDOR)

        garbage_report = self.evaluator.evaluate_text("   \n-----\n???\n")
        self.assertEqual(garbage_report.action, ItemEvaluationAction.VENDOR)


if __name__ == "__main__":
    unittest.main()
