"""
Giao Diện Overlay HUD Bán Trong Suốt Cho Path of Exile 2 (CustomTkinter)
"""

from typing import Optional
from src.common.audio_feedback import enqueue_beep

import customtkinter as ctk
import win32clipboard

from src.agentic_engine.coordinator import AgenticCoordinator
from src.assistant_tool.auto_quester import AutoQuester
from src.assistant_tool.config import Config
from src.assistant_tool.core_shm_bridge import CoreShmBridge, CoreTelemetrySnapshot
from src.assistant_tool.discord_monitor import ClipboardTradeSniffer, DiscordTradeOffer, LocalDiscordBridgeServer
from src.assistant_tool.gem_manager import GemManager
from src.assistant_tool.gold_tracker import GoldTracker
from src.assistant_tool.log_watcher import LogEvent, LogWatcher
from src.assistant_tool.market_advisor import ArbitrageTrade, MarketAdvisor

try:
    from src.assistant_tool.optical_hp_sensor import OpticalHPSensor
except ImportError:
    try:
        from optical_hp_sensor import OpticalHPSensor  # type: ignore[no-redef]
    except ImportError:
        OpticalHPSensor = None  # type: ignore[assignment,misc]


class OverlayHUD(ctk.CTk):
    def __init__(self, gold_tracker: GoldTracker, log_watcher: LogWatcher, market_advisor: MarketAdvisor, core_bridge: Optional[CoreShmBridge] = None):
        super().__init__()

        self.gold_tracker = gold_tracker
        self.log_watcher = log_watcher
        self.market_advisor = market_advisor
        self.core_bridge = core_bridge
        self.agentic_coordinator = AgenticCoordinator.get_instance()
        self.optical_sensor = OpticalHPSensor(expected_max_hp=0) if OpticalHPSensor is not None else None

        # Thiết lập thuộc tính cửa sổ Overlay
        self.title("POE2 Realtime Trading Advisor & HUD")
        self.geometry(f"{Config.OVERLAY_WIDTH}x{Config.OVERLAY_HEIGHT}+50+50")
        self.minsize(420, 520)

        # Cửa sổ ghim trên cùng & không viền Windows chuẩn (Click & Drag Header)
        self.attributes("-topmost", True)
        self.attributes("-alpha", Config.DEFAULT_OPACITY)
        self.configure(fg_color=Config.THEME["bg_dark"])

        # Thiết lập chế độ màu sắc CustomTkinter
        ctk.set_appearance_mode("Dark")
        ctk.set_default_color_theme("blue")

        # Quản lý kéo thả di chuyển cửa sổ
        self._drag_start_x = 0
        self._drag_start_y = 0

        self.gem_manager = GemManager()
        self.auto_quester = AutoQuester()

        # Khởi tạo các thành phần giao diện
        self._create_header()
        self._create_telemetry_panel()
        self._create_automation_panel()
        self._create_gold_panel()
        self._create_tabs()

        # Đăng ký lắng nghe sự kiện từ GoldTracker & LogWatcher (bọc qua self.after để an toàn luồng GUI Tkinter)
        self.gold_tracker.register_listener(lambda new_gold: self.after(0, self._on_gold_changed, new_gold))
        self.log_watcher.register_listener(lambda evt: self.after(0, self._on_log_event, evt))
        try:
            seeded = self.log_watcher.seed_latest_playable_zone()
            if seeded is not None:
                self.after(0, self._on_log_event, seeded)
        except Exception:
            pass

        # Đăng ký lắng nghe từ Core Engine qua Shared Memory IPC
        if self.core_bridge:
            self.core_bridge.register_listener(lambda snap: self.after(0, self._on_telemetry_update, snap))
            self.core_bridge.register_low_hp_alert(lambda cur, max_hp, pct: self.after(0, self._on_low_hp_alert, cur, max_hp, pct))
            self.core_bridge.start()

        # Khởi động bộ theo dõi Clipboard tự động bắt tin nhắn Discord
        self.clipboard_sniffer = ClipboardTradeSniffer(
            callback=lambda offer: self.after(0, self._on_discord_offer_received, offer),
            get_league_fn=lambda: self.market_advisor.league
        )
        self.clipboard_sniffer.start()

        # Khởi động cổng nhận tin tự động từ Discord Web Bridge
        self.discord_bridge = LocalDiscordBridgeServer(
            callback=lambda offer: self.after(0, self._on_discord_offer_received, offer),
            get_league_fn=lambda: self.market_advisor.league
        )
        self.discord_bridge.start()

        # Cập nhật danh sách cơ hội ban đầu
        self.refresh_arbitrage_list()

    def _safe_after(self, func, *args) -> None:
        self.after(0, func, *args)

    # ==========================================================
    # 1. PHẦN ĐẦU CỬA SỔ (HEADER & DRAGGING)
    # ==========================================================
    def _create_header(self):
        self.header_frame = ctk.CTkFrame(self, fg_color="#0e131d", corner_radius=0, height=36)
        self.header_frame.pack(fill="x", side="top")

        # Xử lý sự kiện kéo thả cửa sổ
        self.header_frame.bind("<Button-1>", self._start_drag)
        self.header_frame.bind("<B1-Motion>", self._on_drag)

        # Tiêu đề Tool
        title_label = ctk.CTkLabel(
            self.header_frame,
            text="⚡ POE2 ADVISOR",
            font=ctk.CTkFont(family="Segoe UI", size=12, weight="bold"),
            text_color=Config.THEME["accent_gold"]
        )
        title_label.pack(side="left", padx=8, pady=4)
        title_label.bind("<Button-1>", self._start_drag)
        title_label.bind("<B1-Motion>", self._on_drag)

        # Nút đóng tool
        close_btn = ctk.CTkButton(
            self.header_frame,
            text="✕",
            width=24,
            height=20,
            fg_color="#ef4444",
            hover_color="#b91c1c",
            command=self.destroy,
            font=ctk.CTkFont(size=11, weight="bold")
        )
        close_btn.pack(side="right", padx=6, pady=4)

        # Nút thu nhỏ / ẩn
        min_btn = ctk.CTkButton(
            self.header_frame,
            text="—",
            width=24,
            height=20,
            fg_color="#334155",
            hover_color="#475569",
            command=self.iconify,
            font=ctk.CTkFont(size=11, weight="bold")
        )
        min_btn.pack(side="right", padx=2, pady=4)

        # Thanh trượt điều chỉnh Độ mờ (Opacity Slider)
        self.opacity_label = ctk.CTkLabel(
            self.header_frame,
            text=f"{int(Config.DEFAULT_OPACITY * 100)}%",
            font=ctk.CTkFont(size=10),
            text_color=Config.THEME["text_muted"]
        )
        self.opacity_label.pack(side="right", padx=4)

        self.opacity_slider = ctk.CTkSlider(
            self.header_frame,
            from_=Config.MIN_OPACITY,  # type: ignore[arg-type]
            to=Config.MAX_OPACITY,  # type: ignore[arg-type]
            number_of_steps=16,
            width=70,
            height=12,
            command=self._on_opacity_change
        )
        self.opacity_slider.set(Config.DEFAULT_OPACITY)
        self.opacity_slider.pack(side="right", padx=2)

    def _start_drag(self, event):
        self._drag_start_x = event.x
        self._drag_start_y = event.y

    def _on_drag(self, event):
        deltax = event.x - self._drag_start_x
        deltay = event.y - self._drag_start_y
        x = self.winfo_x() + deltax
        y = self.winfo_y() + deltay
        self.geometry(f"+{x}+{y}")

    def _on_opacity_change(self, val):
        self.attributes("-alpha", val)
        self.opacity_label.configure(text=f"{int(val * 100)}%")

    # ==========================================================
    # 1.5. BẢNG TRẠNG THÁI TELEMETRY & LIVE HP (CORE SHM)
    # ==========================================================
    def _create_telemetry_panel(self):
        self.telemetry_frame = ctk.CTkFrame(
            self,
            fg_color="#0b0f17",
            border_color="#1e293b",
            border_width=1,
            corner_radius=6
        )
        self.telemetry_frame.pack(fill="x", padx=8, pady=(4, 2))

        # Hàng 1: Live HP + Mini Progress Bar + Core Status + Panic
        hp_row = ctk.CTkFrame(self.telemetry_frame, fg_color="transparent")
        hp_row.pack(fill="x", padx=6, pady=(3, 1))

        self.core_status_badge = ctk.CTkLabel(
            hp_row,
            text="⚪ Standby",
            font=ctk.CTkFont(family="Segoe UI", size=10, weight="bold"),
            text_color="#94a3b8"
        )
        self.core_status_badge.pack(side="left", padx=(0, 6))

        self.hp_label = ctk.CTkLabel(
            hp_row,
            text="❤️ HP: -- / --",
            font=ctk.CTkFont(family="Segoe UI", size=11, weight="bold"),
            text_color="#e2e8f0"
        )
        self.hp_label.pack(side="left", padx=(0, 4))
        self.hp_label.bind("<Button-1>", lambda e: self._on_vitals_quick_set())

        self.hp_bar = ctk.CTkProgressBar(
            hp_row,
            height=10,
            corner_radius=3,
            fg_color="#1e293b",
            progress_color="#10b981"
        )
        self.hp_bar.set(0.0)
        self.hp_bar.pack(side="left", fill="x", expand=True, padx=4)
        self.hp_bar.bind("<Button-1>", lambda e: self._on_vitals_quick_set())

        self.panic_btn = ctk.CTkButton(
            hp_row,
            text="🛑 Panic",
            width=48,
            height=18,
            fg_color="#7f1d1d",
            hover_color="#991b1b",
            font=ctk.CTkFont(size=9, weight="bold"),
            command=self._on_panic_stop_clicked
        )
        self.panic_btn.pack(side="right", padx=(4, 0))

        # Hàng 2: Khu vực + Tài nguyên Shield / Mana / Spirit
        res_row = ctk.CTkFrame(self.telemetry_frame, fg_color="transparent")
        res_row.pack(fill="x", padx=6, pady=(0, 3))

        self.area_badge = ctk.CTkLabel(
            res_row,
            text="📍 Khu vực: Chờ kết nối...",
            font=ctk.CTkFont(size=10, weight="bold"),
            text_color="#38bdf8"
        )
        self.area_badge.pack(side="left")

        self.resources_label = ctk.CTkLabel(
            res_row,
            text="🛡️ ES: --/-- | 💧 Mana: --/-- | ✨ Spirit: --/--",
            font=ctk.CTkFont(family="Segoe UI", size=10),
            text_color="#94a3b8",
            anchor="e"
        )
        self.resources_label.pack(side="right")
        self.resources_label.bind("<Button-1>", lambda e: self._on_vitals_quick_set())

    def _create_automation_panel(self):
        """Dynamic 1-Line Status Ticker thay thế 4 banner essay chiếm 120px."""
        self.automation_frame = ctk.CTkFrame(
            self,
            fg_color="#111622",
            border_color="#1f293d",
            border_width=1,
            corner_radius=6,
            height=28
        )
        self.automation_frame.pack(fill="x", padx=8, pady=(2, 2))

        pills_row = ctk.CTkFrame(self.automation_frame, fg_color="transparent")
        pills_row.pack(fill="x", padx=6, pady=2)

        self.reflex_label = ctk.CTkLabel(
            pills_row,
            text="⚡ Iframe/Flasks",
            font=ctk.CTkFont(family="Segoe UI", size=10, weight="bold"),
            text_color="#fbbf24"
        )
        self.reflex_label.pack(side="left", padx=(0, 8))

        self.loot_label = ctk.CTkLabel(
            pills_row,
            text="🎒 Loot R30",
            font=ctk.CTkFont(family="Segoe UI", size=10, weight="bold"),
            text_color="#f59e0b"
        )
        self.loot_label.pack(side="left", padx=(0, 8))

        self.combo_label = ctk.CTkLabel(
            pills_row,
            text="⚔️ Combo [E/RMB/R]",
            font=ctk.CTkFont(family="Segoe UI", size=10, weight="bold"),
            text_color="#fb923c"
        )
        self.combo_label.pack(side="left", padx=(0, 8))

        self.quest_label = ctk.CTkLabel(
            pills_row,
            text="🧭 Quest Ready",
            font=ctk.CTkFont(family="Segoe UI", size=10, weight="bold"),
            text_color="#38bdf8",
            anchor="e"
        )
        self.quest_label.pack(side="right")

    def _on_vitals_quick_set(self):
        """
        Cơ chế click nhanh trên HUD để đồng bộ/hiệu chuẩn Max HP/Mana:
        - Quét màn hình tức thì bằng OpticalHPSensor.
        - Nhận diện Life (495/503) và Mana (344/344).
        - Gửi lệnh RECALIBRATE_XYZ (opCode 98) với targetX=503, targetY=344 sang C++ Core qua Shared Memory IPC.
        - Hiển thị phản hồi trực quan trên HUD.
        """
        if not hasattr(self, "optical_sensor") or not self.optical_sensor:
            return

        vitals = self.optical_sensor.detect_vitals_from_screen()
        if vitals.max_hp > 0:
            target_hp = vitals.max_hp
            target_mana = vitals.max_mana if vitals.max_mana > 0 else 344
            target_es = vitals.max_shield if (hasattr(vitals, "max_shield") and vitals.max_shield > 0) else 0

            if self.core_bridge and hasattr(self.core_bridge, "send_recalibrate_vitals"):
                self.core_bridge.send_recalibrate_vitals(target_hp, target_mana, target_es)

            # Cập nhật nhãn và trạng thái trên HUD
            badge_text = f"🎯 Đã đồng bộ {target_hp} HP / {target_mana} MP"
            if target_es > 0:
                badge_text += f" / {target_es} ES"
            self.core_status_badge.configure(
                text=badge_text,
                text_color="#10b981"
            )
            self.hp_label.configure(
                text=f"❤️ HP: {vitals.current_hp} / {target_hp} ({int(vitals.hp_ratio * 100)}%)",
                text_color="#10b981"
            )
            self.hp_bar.set(max(0.0, min(1.0, vitals.hp_ratio)))
            self.hp_bar.configure(progress_color="#10b981")
        else:
            # Nếu chưa đọc được chữ số cụ thể, thử đọc tỉ lệ quang học
            cur, mhp, ratio = self.optical_sensor.read_hp()
            if ratio > 0.0:
                self.core_status_badge.configure(
                    text=f"⚠️ Optical: {int(ratio * 100)}% HP (Bật số trong UI)",
                    text_color="#f59e0b"
                )
            else:
                self.core_status_badge.configure(
                    text="⚠️ Chưa tìm thấy game POE2",
                    text_color="#ef4444"
                )

    def _on_telemetry_update(self, snap: CoreTelemetrySnapshot):
        if not snap.is_online:
            self.core_status_badge.configure(text="⚪ Core Standby", text_color="#94a3b8")
            self.hp_label.configure(text="❤️ HP: -- / --", text_color="#94a3b8")
            self.resources_label.configure(text="🛡️ ES: --/-- | 💧 Mana: --/-- | ✨ Spirit: --/--", text_color="#94a3b8")
            self.hp_bar.set(0.0)
            return

        self.core_status_badge.configure(text="🟢 Core 120Hz Online", text_color="#10b981")
        hp = snap.player.current_hp
        mhp = snap.player.max_hp
        pct = snap.player.hp_percentage

        es = snap.player.current_es
        mes = snap.player.max_es
        ward = getattr(snap.player, "current_ward", 0)
        mward = getattr(snap.player, "max_ward", 0)
        mana = snap.player.current_mana
        mmana = snap.player.max_mana
        spirit = snap.player.current_spirit
        mspirit = snap.player.max_spirit

        # Kiểm tra đối chiếu chéo với Optical Sensor để phát hiện bắt nhầm ô nhớ rác
        has_discrepancy = False
        opt_vitals = getattr(self.optical_sensor, "last_detected_vitals", None) if hasattr(self, "optical_sensor") and self.optical_sensor else None

        if hasattr(self, "optical_sensor") and self.optical_sensor and (mhp > 0):
            if opt_vitals and opt_vitals.max_hp > 0:
                has_discrepancy, _ = self.optical_sensor.check_memory_discrepancy(
                    memory_cur=hp,
                    memory_max=mhp,
                    optical_cur=opt_vitals.current_hp,
                    optical_max=opt_vitals.max_hp,
                    optical_ratio=opt_vitals.hp_ratio
                )

        ward_str = f" | 🔰 Ward: {ward}/{mward}" if mward > 0 else ""
        self.resources_label.configure(
            text=f"🛡️ ES: {es}/{mes}{ward_str} | 💧 Mana: {mana}/{mmana} | ✨ Spirit: {spirit}/{mspirit}",
            text_color="#93c5fd"
        )
        self.hp_bar.set(max(0.0, min(1.0, pct / 100.0)))

        if has_discrepancy and opt_vitals:
            # Cảnh báo lệch bộ nhớ trên HUD Overlay!
            self.hp_label.configure(
                text=f"⚠️ HP: {hp}/{mhp} (LỆCH! MÀN HÌNH: {opt_vitals.current_hp}/{opt_vitals.max_hp})",
                text_color="#ef4444"
            )
            self.hp_bar.configure(progress_color="#ef4444")
            self.core_status_badge.configure(
                text="⚠️ RAM LỆCH MÀN HÌNH [Click HP để sửa]",
                text_color="#f59e0b"
            )
        else:
            self.hp_label.configure(text=f"❤️ HP: {hp} / {mhp} ({int(pct)}%)")
            # Đổi màu cảnh báo trực quan
            if pct < 35.0:
                self.hp_bar.configure(progress_color="#ef4444")
                self.hp_label.configure(text_color="#ef4444")
            elif pct < 60.0:
                self.hp_bar.configure(progress_color="#f59e0b")
                self.hp_label.configure(text_color="#f59e0b")
            else:
                self.hp_bar.configure(progress_color="#10b981")
                self.hp_label.configure(text_color="#e2e8f0")

        # Cập nhật Telemetry sang Agentic Coordinator
        if hasattr(self, "agentic_coordinator"):
            self.agentic_coordinator.on_telemetry_snapshot(snap)

        if snap.area_name:
            self.area_badge.configure(
                text=f"📍 {snap.area_name} (Lv {snap.area_level})",
                text_color="#38bdf8"
            )
            if self.auto_quester.is_town_area("", snap.area_name):
                self.quest_label.configure(
                    text=f">> [AUTO-QUEST] [Làng] {snap.area_name} -> Nhấn 'U' mở World Map dịch chuyển tới mục tiêu!",
                    text_color="#fbbf24"
                )
            else:
                obj = self.auto_quester.get_current_objective("", snap.area_name)
                if obj:
                    self.quest_label.configure(
                        text=f">> [AUTO-QUEST] {obj.area_name} -> {obj.action_type}: {obj.target_name} ({obj.description})",
                        text_color="#38bdf8"
                    )

    def _on_low_hp_alert(self, cur: int, max_hp: int, pct: float):
        enqueue_beep(1600, 120)
        # Hiệu ứng chớp viền đỏ cảnh báo
        self.telemetry_frame.configure(border_color="#ef4444", border_width=2)
        self.after(500, lambda: self.telemetry_frame.configure(border_color="#1e293b", border_width=1))

    def _on_panic_stop_clicked(self):
        if self.core_bridge:
            success = self.core_bridge.send_panic_stop()
            if success:
                self.core_status_badge.configure(text="🛑 Core Stopped", text_color="#ef4444")
                enqueue_beep(800, 100)

    # ==========================================================
    # 2. BẢNG VÀNG & QUẢN TRỊ THUẾ (GOLD PANEL)
    # ==========================================================
    def _create_gold_panel(self):
        gold_frame = ctk.CTkFrame(self, fg_color=Config.THEME["card_bg"], corner_radius=6)
        gold_frame.pack(fill="x", padx=8, pady=(2, 3))

        # Hàng duy nhất: Số dư vàng + Nút nạp + League
        top_row = ctk.CTkFrame(gold_frame, fg_color="transparent")
        top_row.pack(fill="x", padx=8, pady=(4, 2))

        self.gold_display_label = ctk.CTkLabel(
            top_row,
            text=f"💰 {self.gold_tracker.current_gold:,} Gold",
            font=ctk.CTkFont(family="Segoe UI", size=13, weight="bold"),
            text_color=Config.THEME["gold_light"]
        )
        self.gold_display_label.pack(side="left")

        # Nút cộng nhanh số vàng
        for add_val, label_text in [(10000, "+10k"), (50000, "+50k")]:
            btn = ctk.CTkButton(
                top_row,
                text=label_text,
                width=38,
                height=20,
                fg_color="#1e293b",
                hover_color="#334155",
                font=ctk.CTkFont(size=10),
                command=lambda v=add_val: self.gold_tracker.add_gold(v)
            )
            btn.pack(side="left", padx=2)

        self.league_menu = ctk.CTkOptionMenu(
            top_row,
            values=Config.AVAILABLE_LEAGUES,
            command=self._on_league_changed,
            fg_color="#1e293b",
            button_color=Config.THEME["accent_gold"],
            button_hover_color="#d97706",
            text_color="#f1f5f9",
            width=140,
            height=20,
            font=ctk.CTkFont(size=10, weight="bold")
        )
        self.league_menu.set(self.market_advisor.league)
        self.league_menu.pack(side="right")

        # Dòng phụ: Trạng thái quỹ vàng
        self.gold_status_label = ctk.CTkLabel(
            gold_frame,
            text=self.gold_tracker.get_status_description(),
            font=ctk.CTkFont(size=10),
            text_color=Config.THEME["text_muted"],
            wraplength=480,
            justify="left",
            anchor="w"
        )
        self.gold_status_label.pack(fill="x", padx=8, pady=(0, 3))

    # ==========================================================
    # 3. HỆ THỐNG CÁC TAB CHỨC NĂNG (TABS)
    # ==========================================================
    def _create_tabs(self):
        self.tabview = ctk.CTkTabview(self, fg_color="transparent")
        self.tabview.pack(fill="both", expand=True, padx=8, pady=(0, 6))

        self.tab_arbitrage = self.tabview.add("🔥 Kèo Hot Nhất")
        self.tab_discord = self.tabview.add("💬 Discord Trade")
        self.tab_log = self.tabview.add("📜 Nhật Ký Live")
        self.tab_ai = self.tabview.add("🧠 AI Cố Vấn")

        self._build_arbitrage_tab()
        self._build_discord_tab()
        self._build_log_tab()
        self._build_ai_tab()

    def _build_arbitrage_tab(self):
        # Nút quét làm mới danh sách & Mở trang chợ POE2
        btn_row = ctk.CTkFrame(self.tab_arbitrage, fg_color="transparent")
        btn_row.pack(fill="x", pady=2)

        refresh_btn = ctk.CTkButton(
            btn_row,
            text="🔄 Quét Lại Kèo",
            fg_color=Config.THEME["accent_gold"],
            text_color="#000000",
            hover_color="#d97706",
            height=24,
            font=ctk.CTkFont(size=11, weight="bold"),
            command=self.refresh_arbitrage_list
        )
        refresh_btn.pack(side="left", fill="x", expand=True, padx=(0, 4))

        trade_web_btn = ctk.CTkButton(
            btn_row,
            text="🌐 Mở Chợ POE2 Official",
            fg_color="#2563eb",
            hover_color="#1d4ed8",
            height=24,
            font=ctk.CTkFont(size=11, weight="bold"),
            command=self._open_poe2_trade_web
        )
        trade_web_btn.pack(side="right", fill="x", expand=True)

        # Khung cuộn hiển thị danh sách kèo
        self.trades_scroll = ctk.CTkScrollableFrame(
            self.tab_arbitrage,
            fg_color="transparent",
            label_text="Cơ Hội Buôn Chênh Lệch Lợi Nhuận Cao Nhất"
        )
        self.trades_scroll.pack(fill="both", expand=True, pady=2)

    def _build_log_tab(self):
        # Khu vực test sự kiện giả lập
        sim_frame = ctk.CTkFrame(self.tab_log, fg_color="transparent")
        sim_frame.pack(fill="x", pady=2)

        sim_btn = ctk.CTkButton(
            sim_frame,
            text="🧪 Bắn Thử 1 Tin Nhắn Giao Dịch Test",
            fg_color="#2563eb",
            hover_color="#1d4ed8",
            height=24,
            font=ctk.CTkFont(size=11),
            command=self._simulate_test_event
        )
        sim_btn.pack(side="left", fill="x", expand=True, padx=(0, 4))

        clear_btn = ctk.CTkButton(
            sim_frame,
            text="Xóa Log",
            width=50,
            height=24,
            fg_color="#334155",
            hover_color="#475569",
            font=ctk.CTkFont(size=11),
            command=lambda: self.log_textbox.delete("1.0", "end")
        )
        clear_btn.pack(side="right")

        # Hộp văn bản hiển thị dòng nhật ký Client.txt
        self.log_textbox = ctk.CTkTextbox(
            self.tab_log,
            fg_color=Config.THEME["card_bg"],
            text_color=Config.THEME["text_primary"],
            font=ctk.CTkFont(family="Consolas", size=10),
            wrap="word"
        )
        self.log_textbox.pack(fill="both", expand=True, pady=2)

    def _build_ai_tab(self):
        self.ai_report_textbox = ctk.CTkTextbox(
            self.tab_ai,
            fg_color=Config.THEME["card_bg"],
            text_color=Config.THEME["text_primary"],
            font=ctk.CTkFont(family="Segoe UI", size=11),
            wrap="word"
        )
        self.ai_report_textbox.pack(fill="both", expand=True, pady=2)
        self._update_ai_report()

    def _build_discord_tab(self):
        # Banner hướng dẫn
        guide_lbl = ctk.CTkLabel(
            self.tab_discord,
            text="💡 Auto-Sniffer: Copy (Ctrl+C) tin nhắn WTS/WTB trên Discord, tool tự động bóc tách & tính lãi.",
            font=ctk.CTkFont(size=10),
            text_color=Config.THEME["text_muted"],
            wraplength=480,
            justify="left",
            anchor="w"
        )
        guide_lbl.pack(fill="x", pady=(2, 2))

        # Nút thao tác (hàng đơn 2 nút)
        btn_bar = ctk.CTkFrame(self.tab_discord, fg_color="transparent")
        btn_bar.pack(fill="x", pady=2)

        ctk.CTkButton(
            btn_bar,
            text="⚡ Copy Mã Discord Web (F12)",
            fg_color="#10b981",
            hover_color="#059669",
            height=24,
            font=ctk.CTkFont(size=10, weight="bold"),
            command=self._copy_discord_web_script
        ).pack(side="left", fill="x", expand=True, padx=(0, 2))

        ctk.CTkButton(
            btn_bar,
            text="🧪 Giả Lập Kèo Discord (Ctrl+C)",
            fg_color="#5865F2",
            hover_color="#4752c4",
            height=24,
            font=ctk.CTkFont(size=10, weight="bold"),
            command=self._simulate_discord_copy
        ).pack(side="right", fill="x", expand=True, padx=(2, 0))

        # Khung cuộn hiển thị kết quả phân tích kèo Discord vừa copy
        self.discord_scroll = ctk.CTkScrollableFrame(
            self.tab_discord,
            fg_color="transparent",
            label_text="Các Kèo Bắt Được Từ Discord & Đánh Giá AI"
        )
        self.discord_scroll.pack(fill="both", expand=True, pady=2)

    def _on_discord_offer_received(self, offer: DiscordTradeOffer):
        """Xử lý hiển thị khi nhận được kèo giao dịch bóc tách từ Discord."""
        self.tabview.set("💬 Discord Trade")
        enqueue_beep(1400, 100)

        card = ctk.CTkFrame(self.discord_scroll, fg_color=Config.THEME["card_bg"], corner_radius=6)
        card.pack(fill="x", pady=4, padx=2)

        # Header card
        h_row = ctk.CTkFrame(card, fg_color="transparent")
        h_row.pack(fill="x", padx=8, pady=(6, 2))

        ctk.CTkLabel(
            h_row,
            text=f"[{offer.action}] {offer.quantity}x {offer.item_name} @ {offer.price_unit} {offer.price_currency}",
            font=ctk.CTkFont(size=12, weight="bold"),
            text_color=Config.THEME["accent_gold"]
        ).pack(side="left")

        if offer.profit_estimate_div > 0:
            ctk.CTkLabel(
                h_row,
                text=f"+{offer.profit_estimate_div:.1f} Div",
                font=ctk.CTkFont(size=12, weight="bold"),
                text_color=Config.THEME["profit_green"]
            ).pack(side="right")

        # Nội dung gốc bóc tách
        ctk.CTkLabel(
            card,
            text=f"• Tin nhắn Discord: \"{offer.raw_text}\"",
            font=ctk.CTkFont(family="Consolas", size=10),
            text_color="#cbd5e1",
            justify="left",
            wraplength=420,
            anchor="w"
        ).pack(fill="x", padx=8, pady=2)

        # Đánh giá AI
        eval_color = Config.THEME["profit_green"] if ("🔥" in offer.evaluation or "💰" in offer.evaluation) else Config.THEME["text_muted"]
        ctk.CTkLabel(
            card,
            text=f"👉 {offer.evaluation}\nThuế Vàng ước tính: {offer.gold_tax_needed} Gold",
            font=ctk.CTkFont(size=11, weight="bold"),
            text_color=eval_color,
            justify="left",
            wraplength=420,
            anchor="w"
        ).pack(fill="x", padx=8, pady=(2, 6))

        # Ghi log
        self.log_textbox.insert("end", f"[{self._now()}] [DISCORD] Bắt được kèo: {offer.action} {offer.quantity}x {offer.item_name} @ {offer.price_unit} {offer.price_currency}\n")
        self.log_textbox.see("end")

    def _simulate_discord_copy(self):
        """Giả lập hành động người chơi bấm Ctrl+C một tin nhắn rao bán trên Discord."""
        curr_league = self.market_advisor.league
        sample_text = f"WTS 5 Sekhema Keys 4.2 Div each - Fast trade in {curr_league}!"
        win32clipboard.OpenClipboard()
        win32clipboard.EmptyClipboard()
        win32clipboard.SetClipboardText(sample_text, win32clipboard.CF_UNICODETEXT)
        win32clipboard.CloseClipboard()

    def _copy_discord_web_script(self):
        """Sao chép đoạn mã JavaScript kết nối Discord Web vào bộ nhớ tạm."""
        js_code = (
            '/* POE2 Trade Bridge - Tu dong day tin nhan Discord ve Tool POE2 */\n'
            '(() => {\n'
            '  console.log("%c[POE2 Trade Bridge] Dang lang nghe kenh Discord...", "color: #10b981; font-weight: bold; font-size: 14px;");\n'
            '  const sent = new Set();\n'
            '  const send = (t) => {\n'
            '    if (!t || sent.has(t)) return;\n'
            '    sent.add(t);\n'
            '    if (sent.size > 200) { const it = sent.values().next().value; sent.delete(it); }\n'
            '    fetch("http://127.0.0.1:8765/api/discord_message", {\n'
            '      method: "POST",\n'
            '      headers: {"Content-Type": "application/json"},\n'
            '      body: JSON.stringify({text: t})\n'
            '    }).catch(e => console.debug("[POE2 Bridge] Cho Tool POE2...", e));\n'
            '  };\n'
            '  const obs = new MutationObserver(() => {\n'
            '    document.querySelectorAll(\'[id^="message-content-"], [class*="messageContent"]\').forEach(el => {\n'
            '      const txt = el.innerText.trim();\n'
            '      if (/\\b(wts|wtb|sell|buy)\\b/i.test(txt)) send(txt);\n'
            '    });\n'
            '  });\n'
            '  obs.observe(document.body, {childList: true, subtree: true});\n'
            '  alert("✅ [POE2 Tool] Đã kích hoạt lắng nghe kênh Discord thành công!\\nTin nhắn WTS/WTB sẽ tự động gửi về Tool.");\n'
            '})();'
        )
        try:
            win32clipboard.OpenClipboard()
            win32clipboard.EmptyClipboard()
            win32clipboard.SetClipboardText(js_code, win32clipboard.CF_UNICODETEXT)
            win32clipboard.CloseClipboard()
            self.log_textbox.insert("end", f"[{self._now()}] 📋 [DISCORD] Đã copy mã kết nối Discord Web vào Clipboard!\n👉 Hướng dẫn: Mở Discord Web -> Bấm F12 -> Chọn tab Console -> Dán (Ctrl+V) -> Bấm Enter!\n")
            self.log_textbox.see("end")
            enqueue_beep(1200, 100)
        except Exception as e:
            self.log_textbox.insert("end", f"[{self._now()}] ❌ Lỗi copy mã: {e}\n")
            self.log_textbox.see("end")


    # ==========================================================
    # 4. LOGIC XỬ LÝ DỮ LIỆU & RENDER THẺ CƠ HỘI (TRADE CARDS)
    # ==========================================================
    def refresh_arbitrage_list(self):
        """Xóa và vẽ lại danh sách các cơ hội buôn chênh lệch hời nhất."""
        for widget in self.trades_scroll.winfo_children():
            widget.destroy()

        trades = self.market_advisor.get_market_opportunities()

        for idx, t in enumerate(trades):
            card = ctk.CTkFrame(self.trades_scroll, fg_color=Config.THEME["card_bg"], corner_radius=6)
            card.pack(fill="x", pady=5, padx=2)

            # Dòng tiêu đề + Lợi nhuận
            h_row = ctk.CTkFrame(card, fg_color="transparent")
            h_row.pack(fill="x", padx=8, pady=(6, 2))

            profit_badge = ctk.CTkLabel(
                h_row,
                text=f"+{t.net_profit_divine} Div (ROI {t.roi_percent}%)",
                font=ctk.CTkFont(size=12, weight="bold"),
                text_color=Config.THEME["profit_green"]
            )
            profit_badge.pack(side="right", padx=(4, 0))

            title_lbl = ctk.CTkLabel(
                h_row,
                text=f"{idx+1}. {t.title}",
                font=ctk.CTkFont(size=12, weight="bold"),
                text_color=Config.THEME["text_primary"],
                anchor="w",
                wraplength=270,
                justify="left"
            )
            title_lbl.pack(side="left", fill="x", expand=True)

            # Dòng mô tả chi phí vs doanh thu
            desc_lbl = ctk.CTkLabel(
                card,
                text=f"• Chi phí: {t.cost_description}\n• Doanh thu: {t.revenue_description}",
                font=ctk.CTkFont(size=11),
                text_color=Config.THEME["text_muted"],
                justify="left",
                anchor="w"
            )
            desc_lbl.pack(fill="x", padx=8, pady=2)

            # Dòng thuế & Nút thực hiện
            action_row = ctk.CTkFrame(card, fg_color="transparent")
            action_row.pack(fill="x", padx=8, pady=(4, 6))

            # Nút hoàn thành giao dịch (tự trừ thuế và cập nhật)
            done_btn = ctk.CTkButton(
                action_row,
                text="Xong (-Thuế)",
                width=75,
                height=22,
                fg_color="#15803d" if t.is_affordable else "#475569",
                hover_color="#166534",
                font=ctk.CTkFont(size=10, weight="bold"),
                state="normal" if t.is_affordable else "disabled",
                command=lambda trade_item=t: self._on_trade_completed(trade_item)
            )
            done_btn.pack(side="right")

            # Nút Mở Chợ POE2 Official
            trade_btn = ctk.CTkButton(
                action_row,
                text="🔗 Mở Chợ",
                width=65,
                height=22,
                fg_color="#0284c7",
                hover_color="#0369a1",
                font=ctk.CTkFont(size=10, weight="bold"),
                command=lambda u=t.trade_url: self._open_poe2_trade_web(u)
            )
            trade_btn.pack(side="right", padx=(0, 6))

            tax_color = Config.THEME["accent_gold"] if t.is_affordable else Config.THEME["alert_red"]
            tax_text = f"Thuế: {t.gold_tax_required} Gold"
            if not t.is_affordable:
                tax_text += " (THIẾU VÀNG!)"
            else:
                tax_text += f" (Đủ x{t.max_times_affordable})"

            tax_lbl = ctk.CTkLabel(
                action_row,
                text=tax_text,
                font=ctk.CTkFont(size=11, weight="bold"),
                text_color=tax_color,
                anchor="w"
            )
            tax_lbl.pack(side="left", fill="x", expand=True)

    def _open_poe2_trade_web(self, url: Optional[str] = None):
        """Mở trang Chợ POE2 Official trên trình duyệt web mặc định."""
        if not url:
            curr_league = self.market_advisor.league
            url = f"https://www.pathofexile.com/trade2/search/poe2/{curr_league.replace(' ', '%20')}"
        import webbrowser
        webbrowser.open(url)
        self.log_textbox.insert("end", f"[{self._now()}] 🌐 Đã mở Chợ POE2: {url[:55]}...\n")
        self.log_textbox.see("end")

    def _on_trade_completed(self, trade: ArbitrageTrade):
        """Xử lý khi người chơi xác nhận đã khớp 1 kèo giao dịch."""
        success = self.gold_tracker.deduct_tax(trade.category)
        if success:
            self.log_textbox.insert("end", f"[{self._now()}] 💰 Đã thực hiện kèo: {trade.title} (Trừ {trade.gold_tax_required} Gold thuế)\n")
            self.log_textbox.see("end")
            self.refresh_arbitrage_list()
            self._update_ai_report()

    def _on_gold_changed(self, new_gold: int):
        """Callback khi số vàng thay đổi từ bất kỳ nguồn nào."""
        self.gold_display_label.configure(text=f"💰 {new_gold:,} Gold")
        self.gold_status_label.configure(text=self.gold_tracker.get_status_description())
        self.refresh_arbitrage_list()
        self._update_ai_report()

    def _on_log_event(self, event: LogEvent):
        """Callback khi bắt được dòng log mới từ Client.txt."""
        msg = f"[{event.timestamp}] [{event.event_type}] {event.sender}: {event.message}\n"
        self.log_textbox.insert("end", msg)
        self.log_textbox.see("end")

        # Cập nhật Sự kiện Nhật ký sang Agentic Coordinator
        if hasattr(self, "agentic_coordinator"):
            self.agentic_coordinator.on_log_event(event)

    def _update_ai_report(self):
        report = self.market_advisor.get_ai_strategy_report()
        self.ai_report_textbox.delete("1.0", "end")
        self.ai_report_textbox.insert("end", report)

    def _on_league_changed(self, new_league: str):
        """Xử lý khi người chơi đổi phân vùng Mùa giải (League)."""
        self.market_advisor.set_league(new_league)
        self.refresh_arbitrage_list()
        self._update_ai_report()
        self.log_textbox.insert("end", f"[{self._now()}] 🌐 Đã chuyển sang dữ liệu thị trường Mùa giải: '{new_league}'\n")
        self.log_textbox.see("end")

    def _simulate_test_event(self):
        curr_league = self.market_advisor.league
        price = "4.8" if curr_league == "Forbidden Rite" else "3.9"
        self.log_watcher.simulate_event(
            event_type="WHISPER_TRADE",
            sender="ExileTrader_Pro",
            message=f"Hi, I'd like to buy your Sekhema Key for {price} Divine in {curr_league}."
        )

    def _now(self) -> str:
        import time
        return time.strftime("%H:%M:%S")

    def destroy(self):
        try:
            if hasattr(self, 'clipboard_sniffer'):
                self.clipboard_sniffer.stop()
            if hasattr(self, 'discord_bridge'):
                self.discord_bridge.stop()
        except Exception:
            pass
        super().destroy()

