"""Tests for Level 100 EXP Optimization & Map Rotation Planner (Chu Kỳ 9).
=====================================================================
Kiem thu toan dien:
- Phan cap do an toan ban do cho Monk CI (Tier S / A / F).
- Loc bo ban do cam (Blacklist Maps) va chi dinh chuoi quay vong Tier 15-16.
- Uu tien chon ban do toi uu nhat theo tieu chuan Zero-Death (INV-EXP-ZERO-DEATH).
- Xu ly fail-closed khi khong co Waystone dat chuan va yeu cau restock Faustus.
- In bao cao chien luoc Level 100 tuan thu Rule 5: [MO PHONG THUAT TOAN HEADLESS - KHONG PHAI LIVE GAME].
"""

import pytest
from src.assistant_tool.atlas.level_100_exp_planner import (
    ExpStrategyProfile,
    Level100ExpPlanner,
    MapSafetyTier,
    MapTierRotationConfig,
)


class TestLevel100ExpPlanner:
    def test_map_safety_evaluation(self):
        """Kiem tra phan loai an toan ban do dua tren dia hinh va tier."""
        planner = Level100ExpPlanner()

        # Tier S (Dia hinh mo, phang, tuyet doi khong ket)
        assert planner.config.evaluate_map_safety("Beach", 16) == MapSafetyTier.TIER_S_OPTIMAL
        assert planner.config.evaluate_map_safety("Strand", 15) == MapSafetyTier.TIER_S_OPTIMAL
        assert planner.config.evaluate_map_safety("Dunes", 16) == MapSafetyTier.TIER_S_OPTIMAL

        # Tier A (Kha dung)
        assert planner.config.evaluate_map_safety("Mesa", 16) == MapSafetyTier.TIER_A_VIABLE
        assert planner.config.evaluate_map_safety("Atoll", 15) == MapSafetyTier.TIER_A_VIABLE

        # Tier F (CAM: Dia hinh phong giam, cua hep, de chet)
        assert planner.config.evaluate_map_safety("Dungeon", 16) == MapSafetyTier.TIER_F_FORBIDDEN
        assert planner.config.evaluate_map_safety("Cells", 16) == MapSafetyTier.TIER_F_FORBIDDEN
        assert planner.config.evaluate_map_safety("Maze", 16) == MapSafetyTier.TIER_F_FORBIDDEN

        # Tier < 15 -> Tu dong bi xep TIER_F_FORBIDDEN cho chien luoc Level 100
        assert planner.config.evaluate_map_safety("Beach", 14) == MapSafetyTier.TIER_F_FORBIDDEN

    def test_select_next_rotation_map(self):
        """Kiem tra thuat toan lua chon ban do toi uu nhat theo rank an toan."""
        planner = Level100ExpPlanner()

        waystones_in_stock = [
            {"name": "Dungeon", "tier": 16, "item_id": "ws_dungeon"},  # Tier F -> Bo qua
            {"name": "Mesa", "tier": 15, "item_id": "ws_mesa_15"},      # Tier A, T15
            {"name": "Strand", "tier": 15, "item_id": "ws_strand_15"},  # Tier S, T15
            {"name": "Dunes", "tier": 16, "item_id": "ws_dunes_16"},    # Tier S, T16 (Uu tien so 1!)
            {"name": "Cells", "tier": 16, "item_id": "ws_cells"},      # Tier F -> Bo qua
        ]

        chosen, note = planner.select_next_rotation_map(waystones_in_stock)
        assert chosen is not None
        assert chosen["item_id"] == "ws_dunes_16"
        assert chosen["name"] == "Dunes"
        assert chosen["tier"] == 16
        assert "TIER_S_OPTIMAL" in note

    def test_select_next_rotation_map_empty_or_all_forbidden(self):
        """Kiem tra fail-closed khi kho khong con Waystone an toan cho Monk CI."""
        planner = Level100ExpPlanner()

        bad_stock = [
            {"name": "Dungeon", "tier": 16},
            {"name": "Cells", "tier": 16},
            {"name": "Beach", "tier": 10},  # Tier thap
        ]

        chosen, note = planner.select_next_rotation_map(bad_stock)
        assert chosen is None
        assert "Auto-Restock tu Faustus" in note

    def test_format_level100_strategy_report_rule5_compliant(self, capsys):
        """
        Mo phong xuat bao cao chien luoc Level 100 va kiem tra tieu chuan Rule 5:
        [MO PHONG THUAT TOAN HEADLESS - KHONG PHAI LIVE GAME]
        """
        planner = Level100ExpPlanner()
        report = planner.format_level100_strategy_report()
        print("\n" + report)

        # Kiem tra chuoi bat buoc
        assert "[MO PHONG THUAT TOAN HEADLESS - KHONG PHAI LIVE GAME]" in report
        assert "INV-EXP-ZERO-DEATH" in report
        assert "MONK_CI_ZERO_DEATH_EXP_RUSH" in report
        assert "Beach, Strand, Dunes, Canyon" in report
