"""
Bộ Tư Duy Phản Tư & Hậu Kiểm Chiến Thuật (Post-Encounter Reflection Critic)
Phân tích nguyên nhân gốc rễ (Root Cause Analysis) sau mỗi lần tử trận hoặc hoàn thành map.
"""

import json
import logging
import os
import time
from typing import Any, Dict, List, Optional

logger = logging.getLogger("ReflectionCritic")


class ReflectionCritic:
    """
    Bộ não phản tư cấp cao (Slow-Path Critic).
    Đánh giá sai lầm, phát hiện điểm yếu của build/chiến thuật và tự động đúc kết kinh nghiệm.
    """

    def __init__(
        self,
        memory_file: str = "captures/agent_memory.json",
        api_key: Optional[str] = None,
        model_name: str = "gemini-3.8-flash"
    ):
        self.memory_file = memory_file
        self.api_key = api_key or os.getenv("GEMINI_API_KEY", "")
        self.model_name = model_name
        self.lessons_history: List[Dict[str, Any]] = []
        self._load_memory()

    def analyze_death_event(
        self,
        area_name: str,
        area_level: int,
        killer_info: str,
        blackbox_ticks: List[Dict[str, Any]]
    ) -> Dict[str, Any]:
        local_diag = self._diagnose_blackbox_ticks(blackbox_ticks)

        lesson = {
            "timestamp": time.strftime("%Y/%m/%d %H:%M:%S"),
            "event_type": "PLAYER_DEATH",
            "area_name": area_name,
            "area_level": area_level,
            "killer_info": killer_info,
            "local_diagnosis": local_diag,
            "tactical_adjustment": local_diag.get("recommendation", "Cẩn trọng duy trì cự ly."),
            "verified_in_live": True
        }

        self.lessons_history.append(lesson)
        self._save_memory()
        logger.info(f"[ReflectionCritic] Đã đúc kết bài học sau tử trận: {local_diag.get('summary')}")
        return lesson

    def _diagnose_blackbox_ticks(self, ticks: List[Dict[str, Any]]) -> Dict[str, Any]:
        if not ticks or len(ticks) < 2:
            return {
                "summary": "Không đủ dữ liệu telemetry hộp đen để chẩn đoán.",
                "root_cause": "UNKNOWN",
                "recommendation": "Duy trì phòng thủ cơ bản."
            }

        first_tick = ticks[0]
        last_tick = ticks[-1]
        hp_drop = first_tick.get("hp", 0) - last_tick.get("hp", 0)
        duration_s = max(0.5, (last_tick.get("timestamp_ms", 0) - first_tick.get("timestamp_ms", 0)) / 1000.0)
        dps_taken = hp_drop / duration_s
        monsters_max = max(t.get("monsters_count", 0) for t in ticks)

        if dps_taken > 1500 or (hp_drop / max(1, first_tick.get("max_hp", 1)) > 0.6):
            return {
                "summary": f"Chết do SỐC SÁT THƯƠNG ĐỘT NGỘT (Sụt {hp_drop} HP trong {duration_s:.1f}s, DPS nhận vào: {dps_taken:.0f}).",
                "root_cause": "BURST_SLAM_DAMAGE",
                "recommendation": "Tăng độ nhạy né Iframe Dodge (hạ burst_dodge_threshold xuống 18%) và bổ sung 100% Spell Suppression."
            }
        elif monsters_max >= 8:
            return {
                "summary": f"Chết do BỊ BẦY QUÁI ÁP BẢO VÂY ({monsters_max} quái vật xung quanh).",
                "root_cause": "SWARM_SURROUNDED",
                "recommendation": "Kích hoạt KITE_STABILIZE sớm hơn khi số lượng quái >= 5, nới cự ly thả diều lên 42 đơn vị."
            }
        else:
            return {
                "summary": f"Chết do SÁT THƯƠNG DUY TRÌ / BÀO MÒN (Sụt {hp_drop} HP trong {duration_s:.1f}s).",
                "root_cause": "ATTRITION_OR_DOT",
                "recommendation": "Kiểm tra Kháng Hỗn Loạn (Chaos Res) và nâng ngưỡng tự động bơm bình máu lên 65%."
            }

    def analyze_map_completion(self, area_name: str, duration_s: float, peak_dps: float) -> Dict[str, Any]:
        efficiency = "XUẤT SẮC" if duration_s <= 90 else ("TRUNG BÌNH" if duration_s <= 180 else "CHẬM")
        lesson = {
            "timestamp": time.strftime("%Y/%m/%d %H:%M:%S"),
            "event_type": "MAP_COMPLETED",
            "area_name": area_name,
            "duration_seconds": duration_s,
            "peak_dps": peak_dps,
            "efficiency_tier": efficiency,
            "recommendation": "Duy trì cấu hình chiến đấu hiện tại." if efficiency == "XUẤT SẮC" else "Tập trung nâng DPS để rút ngắn thời gian clear map."
        }
        self.lessons_history.append(lesson)
        self._save_memory()
        return lesson

    def get_recent_lessons(self, limit: int = 5) -> List[Dict[str, Any]]:
        return self.lessons_history[-limit:]

    def _load_memory(self) -> None:
        if os.path.exists(self.memory_file):
            try:
                with open(self.memory_file, "r", encoding="utf-8") as f:
                    self.lessons_history = json.load(f)
            except Exception as e:
                logger.error(f"[ReflectionCritic] Lỗi đọc agent_memory: {e}")

    def _save_memory(self) -> None:
        os.makedirs(os.path.dirname(self.memory_file) or ".", exist_ok=True)
        try:
            with open(self.memory_file, "w", encoding="utf-8") as f:
                json.dump(self.lessons_history[-100:], f, indent=2, ensure_ascii=False)
        except Exception as e:
            logger.error(f"[ReflectionCritic] Lỗi lưu agent_memory: {e}")
