"""
Module Giám Sát & Phân Tích Giá Tin Nhắn Trade Từ Discord (Discord Trade Monitor)
Hỗ trợ cả 2 cơ chế:
1. Tự động qua Clipboard Sniffer (Bấm Ctrl+C bất kỳ tin nhắn nào trong Discord -> Tool tự phân tích ngay).
2. Tự động qua Discord Bot Gateway (Lắng nghe 24/7 các kênh trade Discord nếu cấu hình Bot Token).
"""

import json
import re
import threading
import time
from dataclasses import dataclass
from http.server import BaseHTTPRequestHandler, HTTPServer
from typing import Callable, Optional

import win32clipboard


@dataclass
class DiscordTradeOffer:
    raw_text: str
    action: str            # "WTS" hoặc "WTB"
    item_name: str         # "Sekhema Key", "Divine", "Omen of Greater Exaltation", v.v.
    quantity: int
    price_unit: float
    price_currency: str    # "Divine" hoặc "Chaos"
    evaluation: str        # Đánh giá lời/lỗ
    profit_estimate_div: float
    gold_tax_needed: int
    source: str            # "Clipboard (Discord)" hoặc "Discord Bot Channel"

class DiscordTradeParser:
    """Bóc tách cú pháp tin nhắn mua bán chuẩn cộng đồng Discord PoE / TFT."""

    @staticmethod
    def parse_message(text: str, current_league: str = "Forbidden Rite") -> Optional[DiscordTradeOffer]:
        text_clean = text.strip()
        text_lower = text_clean.lower()

        # Kiểm tra xem có phải tin nhắn giao dịch không
        action = None
        if "wts" in text_lower or "bán" in text_lower:
            action = "WTS"
        elif "wtb" in text_lower or "mua" in text_lower:
            action = "WTB"
        else:
            return None

        # Regex nhận diện các vật phẩm hot trong POE2
        # 1. Sekhema Key
        if "sekhema" in text_lower:
            item = "Sekhema Key"
            # Tìm giá divine
            m_price = re.search(r"(\d+(?:\.\d+)?)\s*(?:div|divine)", text_lower)
            price = float(m_price.group(1)) if m_price else 4.2
            # Tìm số lượng
            m_qty = re.search(r"(?:wts|wtb|bán|mua)?\s*(\d+)\s*(?:x\s*)?sekhema", text_lower)
            qty = int(m_qty.group(1)) if m_qty else 1

            # Đánh giá dựa trên thị trường Forbidden Rite (giá sàn ~4.8 Div)
            market_price = 4.8 if current_league == "Forbidden Rite" else 3.9
            profit = 0.0
            if action == "WTS":
                diff = market_price - price
                if diff > 0.3:
                    eval_str = f"🔥 KÈO RẺ: Người bán rao {price} Div (Rẻ hơn giá sàn {diff:.1f} Div/chìa). Mua ngay bán lại ăn chênh!"
                    profit = diff * qty
                elif diff < -0.3:
                    eval_str = f"⚠️ GIÁ ĐẮT: Người bán rao {price} Div (Đắt hơn giá sàn {-diff:.1f} Div). Không nên mua!"
                else:
                    eval_str = f"ℹ️ GIÁ CHUẨN: Bán đúng giá sàn thị trường ({price} Div)."
            else: # WTB
                diff = price - market_price
                if diff > 0.2:
                    eval_str = f"💰 KÈO HỜI: Khách WTB mua giá cao {price} Div (Cao hơn sàn {diff:.1f} Div). Hãy bán ngay!"
                    profit = diff * qty
                else:
                    eval_str = f"ℹ️ Khách trả {price} Div (Thấp hơn hoặc bằng giá sàn)."

            return DiscordTradeOffer(
                raw_text=text_clean,
                action=action,
                item_name=item,
                quantity=qty,
                price_unit=price,
                price_currency="Divine",
                evaluation=eval_str,
                profit_estimate_div=profit,
                gold_tax_needed=450 * qty,
                source="Discord"
            )

        # 2. Bulk Divine Orbs (Ví dụ: WTS 20 Divine 130c)
        if "divine" in text_lower or "div" in text_lower:
            m_chaos = re.search(r"(\d{2,3})\s*(?:c|chaos)", text_lower)
            m_div_qty = re.search(r"(\d+)\s*(?:div|divine)", text_lower)
            if m_chaos and m_div_qty:
                rate = float(m_chaos.group(1))
                qty = int(m_div_qty.group(1))
                market_rate = 142 if current_league == "Forbidden Rite" else 195

                profit = 0.0
                if action == "WTS":
                    if rate <= 132:
                        profit = ((market_rate - rate) * qty) / market_rate
                        eval_str = f"🔥 KÈO HỐI ĐOÁI RẺ: Bán {rate}c/Div (Gom lại rồi bán sỉ 142c kiếm lãi ~{profit:.2f} Div)!"
                    else:
                        eval_str = f"ℹ️ Tỷ giá {rate}c/Div (Bình thường)."
                else:
                    if rate >= 140:
                        profit = ((rate - 130) * qty) / 130
                        eval_str = f"💰 Khách mua sỉ giá cao {rate}c/Div. Bán ngay thu lãi ~{profit:.2f} Div!"
                    else:
                        eval_str = f"ℹ️ Khách tìm mua tỷ giá {rate}c/Div."

                return DiscordTradeOffer(
                    raw_text=text_clean,
                    action=action,
                    item_name="Divine Orb (Bulk)",
                    quantity=qty,
                    price_unit=rate,
                    price_currency="Chaos",
                    evaluation=eval_str,
                    profit_estimate_div=profit,
                    gold_tax_needed=350 * qty,
                    source="Discord"
                )

        # 3. Omen of Greater Exaltation
        if "omen" in text_lower:
            m_price = re.search(r"(\d+(?:\.\d+)?)\s*(?:div|divine)", text_lower)
            price = float(m_price.group(1)) if m_price else 3.2
            market_price = 4.6
            diff = market_price - price
            profit = max(0.0, diff)
            eval_str = f"🔮 Điềm Báo Omen: Giá rao {price} Div (Thị trường bán sỉ {market_price} Div. Lãi ròng ~{profit:.1f} Div/cái)!"
            return DiscordTradeOffer(
                raw_text=text_clean,
                action=action,
                item_name="Omen of Greater Exaltation",
                quantity=1,
                price_unit=price,
                price_currency="Divine",
                evaluation=eval_str,
                profit_estimate_div=profit,
                gold_tax_needed=300,
                source="Discord"
            )

        return None


class ClipboardTradeSniffer:
    """Luồng ngầm theo dõi Clipboard: Khi người dùng bấm Ctrl+C tin nhắn trên Discord -> Phân tích tức thì!"""

    def __init__(self, callback: Callable[[DiscordTradeOffer], None], get_league_fn: Callable[[], str]):
        self.callback = callback
        self.get_league_fn = get_league_fn
        self._running = False
        self._thread: Optional[threading.Thread] = None
        self._last_text = ""

    def start(self):
        self._running = True
        self._thread = threading.Thread(target=self._loop, daemon=True)
        self._thread.start()

    def stop(self):
        self._running = False

    def _loop(self):
        try:
            import ctypes

            import win32con
            import win32service
            h_desk = win32service.OpenDesktop("Default", 0, False, win32con.GENERIC_ALL)
            ctypes.windll.user32.SetThreadDesktop(int(h_desk))  # type: ignore[arg-type]
        except Exception:
            pass

        while self._running:
            try:
                win32clipboard.OpenClipboard()
                if win32clipboard.IsClipboardFormatAvailable(win32clipboard.CF_UNICODETEXT):
                    data = win32clipboard.GetClipboardData(win32clipboard.CF_UNICODETEXT)
                else:
                    data = None
                win32clipboard.CloseClipboard()

                if data and data != self._last_text:
                    self._last_text = data
                    # Kiểm tra và bóc tách
                    league = self.get_league_fn()
                    offer = DiscordTradeParser.parse_message(data, current_league=league)
                    if offer:
                        self.callback(offer)
            except Exception:
                try:
                    win32clipboard.CloseClipboard()
                except Exception:
                    pass

            time.sleep(0.4)


class LocalDiscordBridgeServer:
    """Máy chủ cầu nối cục bộ (Local Webhook Bridge) nhận tin nhắn tự động từ Discord Web / Extension."""

    def __init__(self, callback: Callable[[DiscordTradeOffer], None], get_league_fn: Callable[[], str], port: int = 8765):
        self.callback = callback
        self.get_league_fn = get_league_fn
        self.port = port
        self._server = None
        self._thread = None

    def start(self):
        parent_self = self

        class WebhookHandler(BaseHTTPRequestHandler):
            def do_POST(self):
                if self.path == "/api/discord_message":
                    try:
                        content_length = int(self.headers.get('Content-Length', 0))
                        post_data = self.rfile.read(content_length)
                        data = json.loads(post_data.decode('utf-8'))
                        text = data.get("text", "")

                        league = parent_self.get_league_fn()
                        offer = DiscordTradeParser.parse_message(text, current_league=league)
                        if offer:
                            offer.source = "Discord Web Stream"
                            parent_self.callback(offer)

                        self.send_response(200)
                        self.send_header('Content-type', 'application/json')
                        self.send_header('Access-Control-Allow-Origin', '*')
                        self.end_headers()
                        self.wfile.write(b'{"status": "success"}')
                    except Exception:
                        self.send_response(500)
                        self.end_headers()
                else:
                    self.send_response(404)
                    self.end_headers()

            def do_OPTIONS(self):
                self.send_response(200)
                self.send_header('Access-Control-Allow-Origin', '*')
                self.send_header('Access-Control-Allow-Methods', 'POST, OPTIONS')
                self.send_header('Access-Control-Allow-Headers', 'Content-Type')
                self.end_headers()

            def log_message(self, format, *args):
                pass

        try:
            self._server = HTTPServer(('127.0.0.1', self.port), WebhookHandler)
            self._thread = threading.Thread(target=self._server.serve_forever, daemon=True)
            self._thread.start()
            print(f"[DiscordBridge] Cổng nhận tin nhắn tự động đang mở tại http://127.0.0.1:{self.port}/api/discord_message", flush=True)
        except Exception as e:
            print(f"[DiscordBridge] Không thể mở cổng {self.port}: {e}", flush=True)

    def stop(self):
        if self._server:
            self._server.shutdown()
