"""
Unit test cho ModifierFilter & evaluate_modifiers (Map & Monster Modifiers)
100% Zero-Disk, Zero-Ban risk, tuân thủ Rule 8, Rule 9, Rule 14.
"""

import os
import sys

sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))

from src.assistant_tool.modifier_filter import (
    ModifierFilter,
    ModReport,
    ModSeverity,
    evaluate_modifiers,
)


def test_empty_and_blank_text_evaluation():
    """Kiểm tra xử lý văn bản trống hoặc chỉ có khoảng trắng."""
    r1 = evaluate_modifiers("")
    assert r1.safety_score == 100
    assert r1.is_brick is False
    assert len(r1.red_mods) == 0
    assert len(r1.green_mods) == 0

    r2 = evaluate_modifiers("   \n\t  ")
    assert r2.safety_score == 100
    assert r2.is_brick is False


def test_brick_modifiers_detection():
    """Kiểm tra nhận diện chính xác các Brick Mods (Reflect, No Leech, No Regen)."""
    # 1. Reflect Physical / Elemental Damage
    map_reflect = (
        "Area contains 2 additional Harbingers\n"
        "Monsters reflect 18% of Physical Damage\n"
        "60% increased Quantity of Items found in this Area"
    )
    r_ref = evaluate_modifiers(map_reflect)
    assert r_ref.is_brick is True
    assert any("Reflect" in m for m in r_ref.red_mods)
    assert r_ref.safety_score <= 65
    assert "BRICK" in r_ref.danger_summary

    # 2. No Leech
    map_no_leech = "Players cannot Leech Life or Energy Shield"
    r_leech = evaluate_modifiers(map_no_leech)
    assert r_leech.is_brick is True
    assert any("No Leech" in m for m in r_leech.red_mods)

    # 3. No Regen
    map_no_regen = "Players cannot Regenerate Life, Mana or Energy Shield"
    r_regen = evaluate_modifiers(map_no_regen)
    assert r_regen.is_brick is True
    assert any("No Regen" in m for m in r_regen.red_mods)


def test_dangerous_modifiers_detection():
    """Kiểm tra nhận diện các mod nguy hiểm (-Max Res, Crit, Curse, Desecrated Ground)."""
    dangerous_map = (
        "-12% to all maximum Resistances\n"
        "Monsters deal 70% extra Damage as Cold\n"
        "Monsters have 300% increased Critical Strike Chance\n"
        "Area has patches of Desecrated Ground\n"
        "Players are Cursed with Elemental Weakness"
    )
    r = evaluate_modifiers(dangerous_map)
    assert r.is_brick is False
    assert len(r.red_mods) == 5
    assert any("-Max Res" in m for m in r.red_mods)
    assert any("Crit / Extra Dmg" in m for m in r.red_mods)
    assert any("Corrupted Blood / Curse" in m for m in r.red_mods)
    assert r.safety_score < 50
    assert "NGUY HIỂM" in r.danger_summary


def test_reward_modifiers_detection():
    """Kiểm tra nhận diện mod XANH (Quantity, Rarity, Pack Size)."""
    reward_map = (
        "85% increased Quantity of Items found in this Area\n"
        "50% increased Rarity of Items found in this Area\n"
        "32% increased Monster Pack Size"
    )
    r = evaluate_modifiers(reward_map)
    assert r.is_brick is False
    assert len(r.red_mods) == 0
    assert len(r.green_mods) == 3
    assert any("Quantity" in m for m in r.green_mods)
    assert any("Rarity" in m for m in r.green_mods)
    assert any("Pack Size" in m for m in r.green_mods)
    assert r.safety_score == 100
    assert "AN TOÀN" in r.danger_summary


def test_mixed_map_evaluation():
    """Kiểm tra Map tổng hợp có cả mod Xanh và Đỏ (không Brick)."""
    mixed_map = (
        "30% increased Monster Pack Size\n"
        "65% increased Quantity of Items found in this Area\n"
        "Monsters deal 50% extra Damage as Lightning\n"
        "Monsters have 20% increased Movement Speed"
    )
    r = evaluate_modifiers(mixed_map)
    assert r.is_brick is False
    assert len(r.green_mods) == 2
    assert len(r.red_mods) == 1
    assert len(r.neutral_mods) == 1
    assert "Movement Speed" in r.neutral_mods[0]
    assert 80 <= r.safety_score <= 95


def test_monk_ci_specific_brick_and_dangerous_modifiers():
    """Kiểm tra nhận diện các mod tử thần riêng cho Monk CI (Less ES Recovery, Immune Freeze)."""
    # 1. Less Energy Shield Recovery -> BRICK
    map_less_es = (
        "Area contains 3 additional Breaches\n"
        "Players have 60% less Recovery Rate of Energy Shield\n"
        "40% increased Monster Pack Size"
    )
    r_es = evaluate_modifiers(map_less_es)
    assert r_es.is_brick is True
    assert any("No/Less ES Recovery" in m for m in r_es.red_mods)
    assert "BRICK" in r_es.danger_summary

    # 2. Cannot Recharge ES -> BRICK
    map_no_recharge = "Players cannot Recharge Energy Shield"
    r_recharge = evaluate_modifiers(map_no_recharge)
    assert r_recharge.is_brick is True
    assert any("No/Less ES Recovery" in m for m in r_recharge.red_mods)

    # 3. Monsters cannot be Frozen or Stunned -> DANGEROUS
    map_immune = (
        "Monsters cannot be Frozen or Stunned\n"
        "Players have 25% reduced Cooldown Recovery Rate"
    )
    r_immune = evaluate_modifiers(map_immune)
    assert r_immune.is_brick is False
    assert len(r_immune.red_mods) == 2
    assert any("Immune Freeze/Stun" in m for m in r_immune.red_mods)
    assert any("Reduced Action/Cooldown" in m for m in r_immune.red_mods)


if __name__ == "__main__":
    test_empty_and_blank_text_evaluation()
    test_brick_modifiers_detection()
    test_dangerous_modifiers_detection()
    test_reward_modifiers_detection()
    test_mixed_map_evaluation()
    test_monk_ci_specific_brick_and_dangerous_modifiers()
    print("✅ TẤT CẢ TEST MODIFIER FILTER ĐỀU VƯỢT QUA 100%!")

