"""AutoPOE2 - Giao Diện Thị Trường & Dynamic Pickit Sync (Market Pricing Panel).

Cung cấp widget theo dõi tỷ giá thị trường thời gian thực,
tự động đồng bộ các vật phẩm >= 1.0 Chaos vào bộ lọc nhặt đồ Pickit của C++ Core 120Hz.
Tuân thủ Rule 1, Rule 4 (Kiến Trúc Module Hóa), Rule 7 (Chuẩn Người Chơi Thật).
"""

from __future__ import annotations

import threading
from typing import Any, Dict
import customtkinter as ctk

from src.assistant_tool import ui_theme as theme
from src.assistant_tool.pickit.dynamic_pickit_updater import (
    update_pickit_filter_from_market,
    get_valuable_market_items,
)
from src.assistant_tool.pickit.market_price_fetcher import MarketPriceFetcher


def build_market_pricing_section(app: Any, parent: Any) -> None:
    """Xây dựng cụm widget Thị trường & Dynamic Pickit trong UI."""
    sec = app._create_section_label(parent, "💎 THỊ TRƯỜNG THỜI GIAN THỰC & DYNAMIC PICKIT (>= 1 CHAOS)")
    sec.pack(anchor="w", pady=(8, 4))

    card = ctk.CTkFrame(parent, fg_color=theme.c("card_bg"), corner_radius=6)
    card.pack(fill="x", padx=8, pady=4)

    # 1. Hàng trạng thái tỷ giá & league
    info_row = ctk.CTkFrame(card, fg_color="transparent")
    info_row.pack(fill="x", padx=10, pady=(6, 2))

    app.lbl_market_league = ctk.CTkLabel(
        info_row,
        text="🌐 Mùa giải: Đang tải...",
        font=ctk.CTkFont(size=11, weight="bold"),
        text_color=theme.c("text_primary"),
    )
    app.lbl_market_league.pack(side="left")

    app.lbl_market_rates = ctk.CTkLabel(
        info_row,
        text="  |  Tỷ giá: Đang kết nối...",
        font=ctk.CTkFont(size=10),
        text_color="#94a3b8",
    )
    app.lbl_market_rates.pack(side="left", padx=6)

    # 2. Hàng hiển thị số lượng items >= 1 Chaos
    count_row = ctk.CTkFrame(card, fg_color="transparent")
    count_row.pack(fill="x", padx=10, pady=2)

    app.lbl_market_valuable_count = ctk.CTkLabel(
        count_row,
        text="🎯 Số vật phẩm đang nhặt (>= 1.0 Chaos): Đang quét...",
        font=ctk.CTkFont(size=11),
        text_color="#38bdf8",
    )
    app.lbl_market_valuable_count.pack(side="left")

    # 3. Checkbox tự động đồng bộ định kỳ
    app.chk_auto_sync_market = ctk.CTkCheckBox(
        card,
        text="Tự động đồng bộ giá thị trường định kỳ mỗi 15 phút (Cold Path)",
        font=ctk.CTkFont(size=11),
        text_color="#e2e8f0",
        fg_color=theme.c("start"),
        hover_color=theme.c("ok_hover"),
    )
    app.chk_auto_sync_market.select()
    app.chk_auto_sync_market.pack(anchor="w", padx=10, pady=4)

    # 4. Hàng nút bấm kích hoạt đồng bộ
    btn_row = ctk.CTkFrame(card, fg_color="transparent")
    btn_row.pack(fill="x", padx=10, pady=(4, 8))

    app.btn_sync_market_now = ctk.CTkButton(
        btn_row,
        text="⚡ Đồng Bộ Giá & Cập Nhật Pickit",
        font=ctk.CTkFont(size=10, weight="bold"),
        fg_color=theme.c("info"),
        hover_color=theme.c("info_hover"),
        height=24,
        command=lambda: trigger_market_sync_thread(app),
    )
    app.btn_sync_market_now.pack(side="left")

    app.lbl_market_sync_status = ctk.CTkLabel(
        btn_row,
        text="Sẵn sàng đồng bộ",
        font=ctk.CTkFont(size=10),
        text_color="#94a3b8",
    )
    app.lbl_market_sync_status.pack(side="left", padx=8)

    # Nạp nhanh từ cache nếu có sẵn để hiển thị ngay
    _populate_from_cache_async(app)


def _populate_from_cache_async(app: Any) -> None:
    """Nạp nhanh thông tin từ cache cục bộ lên UI."""
    def _worker():
        fetcher = MarketPriceFetcher()
        cache = fetcher.load_cache(max_age_seconds=None)
        if cache and "items" in cache:
            league = cache.get("league", "Unknown")
            chaos_raw = cache.get("chaos_orb_raw_price", 50.0)
            valuable = [
                k for k, v in cache["items"].items()
                if float(v.get("chaos_value", 0.0)) >= 1.0
            ]
            
            def _apply():
                try:
                    if hasattr(app, "lbl_market_league"):
                        app.lbl_market_league.configure(text=f"🌐 Mùa giải: {league}")
                    if hasattr(app, "lbl_market_rates"):
                        app.lbl_market_rates.configure(
                            text=f"  |  1 Chaos ≈ {chaos_raw:.1f} Shards (Cập nhật: {cache.get('updated_at', '')[:16]})"
                        )
                    if hasattr(app, "lbl_market_valuable_count"):
                        app.lbl_market_valuable_count.configure(
                            text=f"🎯 Số vật phẩm đang nhặt (>= 1.0 Chaos): {len(valuable)} items"
                        )
                except Exception:
                    pass

            if hasattr(app, "after"):
                try:
                    app.after(0, _apply)
                except Exception:
                    pass
            else:
                _apply()

    threading.Thread(target=_worker, daemon=True).start()


def trigger_market_sync_thread(app: Any) -> None:
    """Khởi chạy worker thread đồng bộ giá thị trường ngầm."""
    thread = threading.Thread(target=_run_market_sync_worker, args=(app,), daemon=True)
    thread.start()


def _run_market_sync_worker(app: Any) -> None:
    """Worker tải giá mới từ POE2 Scout API và cập nhật pickup_filter.json."""
    def _set_status(txt: str, color: str):
        try:
            if hasattr(app, "lbl_market_sync_status"):
                app.lbl_market_sync_status.configure(text=txt, text_color=color)
        except Exception:
            pass

    if hasattr(app, "after"):
        try:
            app.after(0, lambda: _set_status("⏳ Đang tải giá từ POE2 Scout API...", theme.c("warning")))
        except Exception:
            pass
    else:
        _set_status("⏳ Đang tải giá từ POE2 Scout API...", theme.c("warning"))

    try:
        res = update_pickit_filter_from_market(min_chaos=1.0, force_refresh=True)
        count = res.get("valuable_items_count", 0)
        league = res.get("league", "Unknown")

        def _success():
            try:
                if hasattr(app, "lbl_market_league"):
                    app.lbl_market_league.configure(text=f"🌐 Mùa giải: {league}")
                if hasattr(app, "lbl_market_valuable_count"):
                    app.lbl_market_valuable_count.configure(
                        text=f"🎯 Số vật phẩm đang nhặt (>= 1.0 Chaos): {count} items"
                    )
                if hasattr(app, "lbl_market_sync_status"):
                    app.lbl_market_sync_status.configure(
                        text=f"✅ Đã cập nhật {count} items >= 1 Chaos vào Pickit!",
                        text_color=theme.c("start"),
                    )
            except Exception:
                pass

        if hasattr(app, "after"):
            try:
                app.after(0, _success)
            except Exception:
                pass
        else:
            _success()
    except Exception as exc:
        err_msg = str(exc)[:30]
        if hasattr(app, "after"):
            try:
                app.after(0, lambda: _set_status(f"❌ Lỗi: {err_msg}", theme.c("danger")))
            except Exception:
                pass
        else:
            _set_status(f"❌ Lỗi: {err_msg}", theme.c("danger"))
