"""
Unit Tests for Waystone Auto-Crafting Engine (Doc 43 P2-1)
==========================================================
Kiểm thử bất biến:
- INV-CRAFT-WAYSTONE-01: CẤM TUYỆT ĐỐI dùng Orb of Alchemy lên Rare / Unique.
- Fail-Closed on Unknown.
- Trigger Ange Exchange khi hết Alchemy.
"""

import pytest
from src.assistant_tool.pickit.waystone_crafter import (
    WaystoneAutoCrafter,
    WaystoneItem,
    WaystoneRarity,
    CraftAction,
)


def test_inv_craft_waystone_01_rare_rejection():
    crafter = WaystoneAutoCrafter()

    # 1. Waystone Rare (Rarity 2) -> BẮT BUỘC BỎ QUA CRAFT (SKIP_CRAFT)
    rare_waystone = WaystoneItem(
        name="Deserted Waystone",
        tier=15,
        rarity=WaystoneRarity.RARE,
        inventory_col=0,
        inventory_row=0,
        affix_count=4,
    )
    action_rare = crafter.evaluate_craft_action(rare_waystone, alchemy_count=10)
    assert action_rare == CraftAction.SKIP_CRAFT, "INV-CRAFT-WAYSTONE-01: Waystone Rare KHÔNG được phép craft!"

    # 2. Waystone Unique (Rarity 3) -> BẮT BUỘC BỎ QUA CRAFT (SKIP_CRAFT)
    unique_waystone = WaystoneItem(
        name="Unique Map Waystone",
        tier=16,
        rarity=WaystoneRarity.UNIQUE,
        inventory_col=1,
        inventory_row=0,
    )
    action_unique = crafter.evaluate_craft_action(unique_waystone, alchemy_count=10)
    assert action_unique == CraftAction.SKIP_CRAFT, "Waystone Unique KHÔNG được phép craft!"


def test_craft_normal_and_magic_waystones():
    crafter = WaystoneAutoCrafter()

    # Waystone Normal (White, Rarity 0) -> APPLY_ALCHEMY
    white_waystone = WaystoneItem(
        name="Deserted Waystone",
        tier=15,
        rarity=WaystoneRarity.NORMAL,
        inventory_col=0,
        inventory_row=0,
    )
    action_white = crafter.evaluate_craft_action(white_waystone, alchemy_count=5)
    assert action_white == CraftAction.APPLY_ALCHEMY

    # Waystone Magic (Blue, Rarity 1) -> APPLY_ALCHEMY
    magic_waystone = WaystoneItem(
        name="Fortress Waystone",
        tier=14,
        rarity=WaystoneRarity.MAGIC,
        inventory_col=2,
        inventory_row=0,
    )
    action_magic = crafter.evaluate_craft_action(magic_waystone, alchemy_count=5)
    assert action_magic == CraftAction.APPLY_ALCHEMY


def test_craft_triggers_ange_when_out_of_alchemy():
    crafter = WaystoneAutoCrafter()

    white_waystone = WaystoneItem(
        name="Deserted Waystone",
        tier=15,
        rarity=WaystoneRarity.NORMAL,
        inventory_col=0,
        inventory_row=0,
    )
    # Alchemy count = 0 -> Kích hoạt Ange Exchange P2-2
    action_no_alch = crafter.evaluate_craft_action(white_waystone, alchemy_count=0)
    assert action_no_alch == CraftAction.TRIGGER_ANGE


def test_craft_fail_closed_on_unknown_or_unsafe():
    crafter = WaystoneAutoCrafter()

    # Unknown rarity -> ABORT_SAFETY
    unknown_waystone = WaystoneItem(
        name="Unknown Waystone",
        tier=15,
        rarity=WaystoneRarity.UNKNOWN,
        inventory_col=0,
        inventory_row=0,
    )
    action_unk = crafter.evaluate_craft_action(unknown_waystone, alchemy_count=5)
    assert action_unk == CraftAction.ABORT_SAFETY

    # Không ở khu an toàn (bị quái vật bao vây) -> ABORT_SAFETY
    normal_waystone = WaystoneItem(
        name="Normal Waystone",
        tier=15,
        rarity=WaystoneRarity.NORMAL,
        inventory_col=0,
        inventory_row=0,
    )
    action_danger = crafter.evaluate_craft_action(normal_waystone, alchemy_count=5, is_in_safe_area=False)
    assert action_danger == CraftAction.ABORT_SAFETY


def test_craft_simulation_success():
    crafter = WaystoneAutoCrafter()
    white_waystone = WaystoneItem(
        name="Deserted Waystone",
        tier=15,
        rarity=WaystoneRarity.NORMAL,
        inventory_col=0,
        inventory_row=0,
    )
    res = crafter.execute_craft_simulation(white_waystone, alchemy_count=5, simulate_success=True)
    assert res.success is True
    assert res.initial_rarity == WaystoneRarity.NORMAL
    assert res.final_rarity == WaystoneRarity.RARE


def test_craft_brick_mod_detection_and_actions():
    crafter = WaystoneAutoCrafter()

    # 1. Waystone chứa mod Reflect Physical Damage -> BRICK
    brick_ws = WaystoneItem(
        name="Deserted Waystone (Reflect)",
        tier=15,
        rarity=WaystoneRarity.RARE,
        inventory_col=0,
        inventory_row=0,
        mods_text="Monsters reflect 18% of Physical Damage\n40% increased Monster Pack Size",
    )
    is_brick, red_mods = crafter.is_brick_waystone(brick_ws.mods_text)
    assert is_brick is True
    assert len(red_mods) > 0

    # Nếu có Orb of Scouring và Alchemy -> Đề xuất REROLL_SCOUR_ALCH
    act_reroll = crafter.evaluate_craft_action(brick_ws, alchemy_count=5, scour_count=5)
    assert act_reroll == CraftAction.REROLL_SCOUR_ALCH

    # Nếu hết Scour -> Đề xuất SKIP_DANGEROUS
    act_skip = crafter.evaluate_craft_action(brick_ws, alchemy_count=5, scour_count=0)
    assert act_skip == CraftAction.SKIP_DANGEROUS

    # 2. Waystone an toàn (không có brick mod)
    safe_ws = WaystoneItem(
        name="Deserted Waystone (Safe)",
        tier=15,
        rarity=WaystoneRarity.RARE,
        inventory_col=0,
        inventory_row=0,
        mods_text="80% increased Quantity of Items found in this Area\n25% increased Monster Pack Size",
    )
    is_brick_safe, _ = crafter.is_brick_waystone(safe_ws.mods_text)
    assert is_brick_safe is False
    act_safe = crafter.evaluate_craft_action(safe_ws, alchemy_count=5, scour_count=5)
    assert act_safe == CraftAction.SKIP_CRAFT

