"""AutoPOE2 - Level 100 EXP Optimization & Map Rotation Planner (Doc 71).
=======================================================================
Bộ hoạch định chiến lược cày cấp Level 90 -> 100 cho Monk Chaos Inoculation (CI):
1. Quản lý chuỗi bản đồ an toàn cao (Tier 15-16 Map Rotation Whitelist).
2. Thiết lập hồ sơ Cây Nội Tại Atlas tối ưu EXP/giờ (Pack Size & Magic/Rare Monsters).
3. Bất biến sinh tồn bất khả xâm phạm: Tỷ lệ tử trận = 0 (INV-EXP-ZERO-DEATH).
4. Phối hợp với Faustus Auto-Restock để duy trì kho Waystone T15-16 >= 10 viên.

Tuân thủ nghiêm ngặt:
- Rule 1: Cold Path Tier 2 (Python 3.11).
- Rule 4: Module hóa độc lập, trần file < 500 dòng.
- Rule 5: Báo cáo gắn nhãn [MÔ PHỎNG THUẬT TOÁN HEADLESS - KHÔNG PHẢI LIVE GAME].
- Bất biến: INV-EXP-ZERO-DEATH, INV-MAP-NO-BRICK, INV-WAYSTONE-RESTOCK-MIN.
"""

from __future__ import annotations

from dataclasses import dataclass, field
from enum import Enum
from typing import Any, Dict, List, Optional, Set, Tuple


class MapSafetyTier(str, Enum):
    """Phân cấp an toàn của bản đồ dựa trên địa hình và rủi ro dồn góc."""
    TIER_S_OPTIMAL = "TIER_S_OPTIMAL"     # Địa hình phẳng, mở, thẳng tắp, không có góc kẹt (Beach, Strand, Dunes, Canyon)
    TIER_A_VIABLE = "TIER_A_VIABLE"       # Địa hình rộng rãi, có chướng ngại vật nhỏ (Mesa, Atoll, Cemetery)
    TIER_F_FORBIDDEN = "TIER_F_FORBIDDEN" # Địa hình phòng giam, cửa hẹp, góc kẹt (Cells, Dungeon, Maze, Malformation)


@dataclass
class MapTierRotationConfig:
    """Cấu hình chuỗi bản đồ Tier 15-16 cho Monk CI."""
    target_tiers: List[int] = field(default_factory=lambda: [15, 16])
    whitelist_maps: Set[str] = field(default_factory=lambda: {
        "Beach", "Strand", "Dunes", "Canyon", "Mesa", "Atoll", "Cemetery"
    })
    blacklist_maps: Set[str] = field(default_factory=lambda: {
        "Dungeon", "Cells", "Maze", "Bone Crypt", "Underground River", "Malformation"
    })
    min_safe_stock: int = 10
    preferred_precursors: List[str] = field(default_factory=lambda: [
        "Pack Size Multiplier",
        "Increased Magic Monsters",
        "Breach Expansion Speed",
        "Delirium Persistence",
    ])

    def evaluate_map_safety(self, map_name: str, tier: int) -> MapSafetyTier:
        """Đánh giá mức độ an toàn của bản đồ đối với Monk CI."""
        clean_name = map_name.strip()
        if clean_name in self.blacklist_maps or tier < min(self.target_tiers):
            return MapSafetyTier.TIER_F_FORBIDDEN
        if clean_name in {"Beach", "Strand", "Dunes", "Canyon"}:
            return MapSafetyTier.TIER_S_OPTIMAL
        if clean_name in self.whitelist_maps:
            return MapSafetyTier.TIER_A_VIABLE
        return MapSafetyTier.TIER_F_FORBIDDEN


@dataclass
class ExpStrategyProfile:
    """Ho so chien luoc EXP/gio toi uu cho Level 90 -> 100."""
    profile_name: str = "MONK_CI_ZERO_DEATH_EXP_RUSH"
    target_level_range: str = "90 -> 100"
    zero_death_enforced: bool = True
    projected_exp_per_hour_millions: float = 45.0
    recommended_mechanics: List[str] = field(default_factory=lambda: [
        "Breach (Mat do quai cao, dong bang dien rong an toan)",
        "Delirium Mirror (Tang 30% Pack Size toan ban do)",
        "Ritual Altars (Gom quai tung dot co kiem soat)",
        "Acceleration & Protection Shrines (Tang toc va giam sat thuong)",
    ])
    forbidden_mechanics: List[str] = field(default_factory=lambda: [
        "Pinnacle Citadel Bosses (Rui ro 1-shot cao)",
        "Simulacrum Wave 25+ (Hinh phat chet qua lon)",
        "Corrupted Nexus High Stacks (Sat thuong thoai hoa nguy hiem)",
    ])



class Level100ExpPlanner:
    """Bộ hoạch định và giám sát chuỗi bản đồ cày cấp Level 100."""

    def __init__(
        self,
        rotation_config: Optional[MapTierRotationConfig] = None,
        strategy_profile: Optional[ExpStrategyProfile] = None,
    ):
        self.config = rotation_config or MapTierRotationConfig()
        self.profile = strategy_profile or ExpStrategyProfile()

    def select_next_rotation_map(
        self,
        available_waystones: List[Dict[str, Any]],
    ) -> Tuple[Optional[Dict[str, Any]], str]:
        """
        Lựa chọn viên Waystone tối ưu nhất trong kho theo tiêu chuẩn Zero-Death:
        1. Lọc bỏ toàn bộ map Tier F (Blacklist địa hình hẹp).
        2. Ưu tiên map Tier S (Beach, Strand, Dunes, Canyon) có Tier 16.
        3. Tiếp theo là Tier S có Tier 15.
        4. Cuối cùng là Tier A có Tier 16/15.
        """
        valid_candidates = []
        for ws in available_waystones:
            name = ws.get("name", "")
            tier = ws.get("tier", 1)
            safety = self.config.evaluate_map_safety(name, tier)
            if safety != MapSafetyTier.TIER_F_FORBIDDEN:
                valid_candidates.append((safety, tier, ws))

        if not valid_candidates:
            return None, "Khong co Waystone nao thoa man tieu chuan an toan Level 100 (Can Auto-Restock tu Faustus)."

        # Sắp xếp: Ưu tiên TIER_S > TIER_A, sau đó ưu tiên Tier cao hơn (16 > 15)
        def _sort_key(item):
            safety, tier, _ = item
            safety_val = 2 if safety == MapSafetyTier.TIER_S_OPTIMAL else 1
            return (safety_val, tier)

        valid_candidates.sort(key=_sort_key, reverse=True)
        chosen = valid_candidates[0][2]
        return chosen, f"Chon [{chosen.get('name')}] Tier {chosen.get('tier')} ({valid_candidates[0][0].value})"

    def format_level100_strategy_report(self) -> str:
        """Định dạng báo cáo chiến lược cày cấp Level 100 chuẩn Rule 5 (ASCII-safe)."""
        lines = [
            "=" * 78,
            " [MO PHONG THUAT TOAN HEADLESS - KHONG PHAI LIVE GAME]",
            " CHIEN LUOC ATLAS EXP LEVEL 90 -> 100 (ZERO-DEATH EXP OPTIMIZATION)",
            "=" * 78,
            f" Ho So Chien Luoc          : {self.profile.profile_name}",
            f" Muc Tieu Cay Cap          : Level {self.profile.target_level_range}",
            f" Bat Bien Sinh Ton         : INV-EXP-ZERO-DEATH ({'BAT BUOC' if self.profile.zero_death_enforced else 'TAT'})",
            f" Uoc Tinh EXP/Gio          : ~{self.profile.projected_exp_per_hour_millions:.1f} Trieu EXP/h (T16 Rotation)",
            "-" * 78,
            " DANH SACH BAN DO AN TOAN CAO (TIER 15-16 WHITELIST):",
            f"   * Tier S (Dia hinh phang): Beach, Strand, Dunes, Canyon",
            f"   * Tier A (Kha dung)      : Mesa, Atoll, Cemetery",
            f"   * Tier F (CAM TUYET DOI) : Dungeon, Cells, Maze, Malformation (Nguy co ket goc)",
            "-" * 78,
            " CO CHE LEAGUE KHUYEN NGHI (MAX EXP DENSITY):",
        ]
        for m in self.profile.recommended_mechanics:
            lines.append(f"   + {m}")

        lines.extend([
            "-" * 78,
            " CO CHE CAM TUYET DOI (ZERO-DEATH ENFORCEMENT):",
        ])
        for f in self.profile.forbidden_mechanics:
            lines.append(f"   - {f}")

        lines.append("=" * 78)
        return "\n".join(lines)
