"""
AutoPOE2 Map & Monster Modifier Filter
Phân tích, phân loại thuộc tính Bản đồ (Map Modifiers) và Quái vật (Monster Modifiers) từ text OCR hoặc clipboard.
100% Zero-Disk, Zero-Ban risk (hoàn toàn thụ động, không can thiệp bộ nhớ hay tệp game GGPK).
Đánh giá độ an toàn (Safety Score), cảnh báo Brick Mod (Reflect, No Leech, No Regen...) và nhận diện Reward Mod (Quantity, Rarity, Pack Size).
"""

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


class ModSeverity(Enum):
    BRICK = "BRICK"          # Cực kỳ nguy hiểm, làm hỏng build / chắc chắn tử trận
    DANGEROUS = "DANGEROUS"  # Nguy hiểm cao, cần chú ý đặc biệt
    NEUTRAL = "NEUTRAL"      # Bình thường
    REWARD = "REWARD"        # An toàn / Tăng thưởng cao (Quant, Rarity, Pack size)


@dataclass
class ModItem:
    text: str
    category: str
    severity: ModSeverity
    description: str


@dataclass
class ModReport:
    raw_text: str
    red_mods: List[str] = field(default_factory=list)
    green_mods: List[str] = field(default_factory=list)
    neutral_mods: List[str] = field(default_factory=list)
    safety_score: int = 100
    is_brick: bool = False
    danger_summary: str = "AN TOÀN"
    details: List[ModItem] = field(default_factory=list)


class ModifierFilter:
    """
    Bộ lọc và đánh giá thuộc tính Map / Quái vật trong Path of Exile 2.
    Phân loại theo quy chuẩn:
    - ĐỎ (Nguy hiểm / Brick):
      * Reflect: Phản đòn sát thương vật lý / nguyên tố
      * No Leech: Không thể hút máu / ES / Mana
      * No Regen: Không thể hồi phục (Life, Mana, Energy Shield)
      * -Max Res: Giảm kháng tối đa (-% maximum Resistances)
      * Crit / Extra Dmg: Quái có thêm chí mạng hoặc sát thương nguyên tố cộng thêm
      * Corrupted Blood / Curse: Lời nguyền nguy hiểm hoặc mặt đất Desecrated Ground
    - XANH (An toàn / Thưởng cao):
      * Quantity: Tăng số lượng đồ rơi
      * Rarity: Tăng độ hiếm đồ rơi
      * Pack Size: Tăng mật độ quái
    """

    # Danh mục Regex cho Mod ĐỎ
    RED_PATTERNS: List[Tuple[str, str, ModSeverity, str]] = [
        # Reflect (Physical / Elemental / Chaos) - BRICK
        (
            r"Reflects?\s+(?:\d+[\.,]?\d*%\s+of\s+)?(?:Physical|Elemental|Chaos)?\s*Damage|Monsters\s+reflect",
            "Reflect",
            ModSeverity.BRICK,
            "Phản đòn sát thương vật lý / nguyên tố (Chết tức thì)"
        ),
        # No Leech - BRICK
        (
            r"(?:Players\s+)?Cannot\s+Leech",
            "No Leech",
            ModSeverity.BRICK,
            "Không thể hút Máu / Energy Shield / Mana"
        ),
        # No Regen - BRICK
        (
            r"(?:Players\s+)?cannot\s+Regenerate|no\s+Life\s+or\s+Mana\s+regeneration",
            "No Regen",
            ModSeverity.BRICK,
            "Không thể hồi phục Máu, Mana hoặc Energy Shield"
        ),
        # -Max Res - DANGEROUS
        (
            r"-\s*(\d+)%\s+(?:to\s+(?:all\s+)?maximum|maximum\s+(?:Player\s+)?Resistances?|reduced\s+maximum\s+Resistances?)|-?\s*(\d+)?%?\s*maximum\s+Player\s+Resistances?",
            "-Max Res",
            ModSeverity.DANGEROUS,
            "Giảm kháng tối đa của nhân vật (Tăng mạnh sát thương phải nhận)"
        ),
        # Anti-Crit - DANGEROUS
        (
            r"Monsters\s+take\s+(?:\d+%\s+)?reduced\s+Extra\s+Damage\s+from\s+Critical\s+Hits",
            "Reduced Crit Dmg",
            ModSeverity.DANGEROUS,
            "Quái giảm sát thương chí mạng phải nhận (Khắc tinh build Crit)"
        ),
        # Monster Speed / Onslaught - DANGEROUS
        (
            r"Monsters\s+have\s+(?:\d+%\s+)?increased\s+Attack,\s*Cast\s+and\s+Movement\s+Speed|Monsters\s+gain\s+(?:.*)?Onslaught",
            "Monster Speed",
            ModSeverity.DANGEROUS,
            "Tăng tốc đánh, xuất chiêu và di chuyển của quái"
        ),
        # Ailments on Hit - DANGEROUS
        (
            r"Monsters\s+have\s+(?:\d+%\s+)?chance\s+to\s+(?:Poison|Bleed|Ignite|Freeze|Shock)\s+on\s+Hit",
            "Ailment on Hit",
            ModSeverity.DANGEROUS,
            "Quái có tỉ lệ gây hiệu ứng xấu (Độc/Chảy máu/Sốc) khi đánh trúng"
        ),
        # Crit / Extra Dmg - DANGEROUS
        (
            r"Monsters\s+deal\s+(?:.*%)?\s*extra\s+Damage\s+as|Monsters\s+have\s+(?:.*%)?\s*increased\s+Critical\s+Strike\s+Chance|\+?(\d+)%\s+to\s+Monster\s+Critical\s+Strike\s+Multiplier",
            "Crit / Extra Dmg",
            ModSeverity.DANGEROUS,
            "Quái gây thêm sát thương nguyên tố hoặc chí mạng cao"
        ),
        # Corrupted Blood / Curse / Hazard - DANGEROUS
        (
            r"Area\s+has\s+patches\s+of\s+Desecrated\s+Ground|Players\s+are\s+Cursed\s+with|Corrupted\s+Blood|Area\s+contains\s+patches",
            "Corrupted Blood / Curse",
            ModSeverity.DANGEROUS,
            "Trạng thái nguy hiểm / Lời nguyền / Đất độc hại"
        ),
        # Less ES Recovery / Cannot Recharge ES - BRICK (CI Monk Survivability)
        (
            r"(?:reduced|less)\s+(?:Recovery\s+Rate\s+of\s+)?Energy\s+Shield|Players\s+cannot\s+Recharge\s+Energy\s+Shield",
            "No/Less ES Recovery",
            ModSeverity.BRICK,
            "Giảm/Chặn hồi phục Energy Shield (Chết tức thì với build CI 1 HP)"
        ),
        # Immune Freeze / Stun - DANGEROUS (Monk CC Dependency)
        (
            r"Monsters\s+cannot\s+be\s+(?:Frozen|Stunned)|Monsters\s+are\s+Hexproof",
            "Immune Freeze/Stun",
            ModSeverity.DANGEROUS,
            "Quái miễn nhiễm Đóng Băng hoặc Choáng (Vô hiệu hóa phòng ngự Monk)"
        ),
        # Reduced Action Speed / Cooldown - DANGEROUS
        (
            r"Players\s+have\s+(?:\d+%\s+)?(?:reduced|less)\s+(?:Cooldown\s+Recovery|Action\s+Speed)",
            "Reduced Action/Cooldown",
            ModSeverity.DANGEROUS,
            "Giảm tốc độ hồi chiêu và hành động (Hạn chế né tránh)"
        ),
    ]

    # Danh mục Regex cho Mod XANH

    GREEN_PATTERNS: List[Tuple[str, str, ModSeverity, str]] = [
        # Pack Size (POE1 & POE2 format)
        (
            r"(?:Pack\s+Size:\s*\+?(\d+)%|(\d+)%\s+increased\s+Monster\s+Pack\s+Size)",
            "Pack Size",
            ModSeverity.REWARD,
            "Tăng mật độ và số lượng quái trong bản đồ"
        ),
        # Rarity (POE1 & POE2 format)
        (
            r"(?:Monster\s+Rarity:\s*\+?(\d+)%|Item\s+Rarity:\s*\+?(\d+)%|(\d+)%\s+increased\s+Rarity\s+of\s+Items)",
            "Rarity",
            ModSeverity.REWARD,
            "Tăng độ hiếm vật phẩm rơi trong bản đồ"
        ),
        # Quantity / Waystone Drop Chance (POE1 & POE2 format)
        (
            r"(?:Waystone\s+Drop\s+Chance:\s*\+?(\d+)%|Item\s+Quantity:\s*\+?(\d+)%|(\d+)%\s+increased\s+Quantity\s+of\s+Items)",
            "Quantity / Drop Chance",
            ModSeverity.REWARD,
            "Tăng số lượng / tỉ lệ rơi đồ và Waystones"
        ),
        # Gold
        (
            r"(?:Gold\s+Drop:\s*\+?(\d+)%|(\d+)%\s+increased\s+Gold)",
            "Gold",
            ModSeverity.REWARD,
            "Tăng số lượng vàng rơi trong bản đồ"
        ),
    ]

    @classmethod
    def evaluate_modifiers(cls, text: str) -> ModReport:
        """
        Đánh giá danh sách mod từ văn bản (từng dòng hoặc đoạn text OCR).
        Tự động chuẩn hóa loại bỏ roll ranges để khớp chính xác trong POE2.
        """
        if not text or not text.strip():
            return ModReport(raw_text=text or "", safety_score=100, danger_summary="AN TOÀN (KHÔNG CÓ MOD)")

        lines = [line.strip() for line in text.splitlines() if line.strip()]
        report = ModReport(raw_text=text)

        score = 100
        has_brick = False

        for line in lines:
            # Chuẩn hóa loại bỏ các dải roll ranges dạng (min-max) trong POE2 text
            clean_line = re.sub(r"\([^)]*\)", "", line).strip()
            clean_line = re.sub(r"\s+", " ", clean_line)

            matched_red = False
            for pattern, cat, sev, desc in cls.RED_PATTERNS:
                if re.search(pattern, clean_line, re.I):
                    report.red_mods.append(f"[{cat}] {line}")
                    report.details.append(ModItem(text=line, category=cat, severity=sev, description=desc))
                    matched_red = True
                    if sev == ModSeverity.BRICK:
                        has_brick = True
                        score -= 40
                    else:
                        score -= 15
                    break

            if matched_red:
                continue

            matched_green = False
            for pattern, cat, sev, desc in cls.GREEN_PATTERNS:
                if re.search(pattern, clean_line, re.I):
                    report.green_mods.append(f"[{cat}] {line}")
                    report.details.append(ModItem(text=line, category=cat, severity=sev, description=desc))
                    matched_green = True
                    score = min(100, score + 5)
                    break

            if not matched_green and not matched_red:
                # Mod trung tính khác
                report.neutral_mods.append(line)

        # Giới hạn safety score trong khoảng [0, 100]
        report.safety_score = max(0, min(100, score))
        report.is_brick = has_brick

        if has_brick:
            report.danger_summary = "🛑 BRICK (CẤM CHẠY - PHẢN ĐÒN / NO REGEN / NO LEECH)"
        elif report.safety_score < 60:
            report.danger_summary = "⚠️ NGUY HIỂM CAO (CẨN TRỌNG)"
        elif report.safety_score < 85:
            report.danger_summary = "⚡ CẨN TRỌNG (CÓ MOD SÁT THƯƠNG / KHÁNG)"
        else:
            report.danger_summary = "🟢 AN TOÀN (CÓ THỂ CHẠY)"

        return report


def evaluate_modifiers(text: str) -> ModReport:
    """Hàm tiện ích cấp module phân tích và đánh giá mod."""
    return ModifierFilter.evaluate_modifiers(text)
