"""
Điểm Khởi Chạy Chính: POE2 Realtime Trading Advisor & Overlay HUD
"""

import ctypes
import os
import sys
import threading
import time
from src.common.audio_feedback import enqueue_beep

# Đảm bảo mã hóa UTF-8 trên Windows console
getattr(sys.stdout, "reconfigure", lambda **kw: None)(encoding="utf-8")

# Thêm đường dẫn thư mục gốc vào sys.path
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../..")))

from src.assistant_tool.config import Config
from src.assistant_tool.core_shm_bridge import CoreShmBridge
from src.assistant_tool.gold_tracker import GoldTracker
from src.assistant_tool.log_watcher import LogWatcher
from src.assistant_tool.market_advisor import MarketAdvisor
from src.assistant_tool.overlay_gui import OverlayHUD


from src.common.win32_window import attach_to_default_desktop

def setup_global_hotkeys(app: OverlayHUD, h_desk=None):
    """
    Đăng ký phím nóng toàn cục F9 (Ẩn/Hiện Overlay) và F10 (Làm mới Kèo).
    Có âm thanh phản hồi (Audio Beep) để nhận biết trạng thái tức thì ngay cả khi đang trong game.
    """
    is_visible = [True]
    VK_F9 = 0x78   # F9 keycode
    VK_F10 = 0x79  # F10 keycode

    def toggle_overlay():
        try:
            if is_visible[0]:
                app.withdraw()
                is_visible[0] = False
                print("[Hotkey F9] Overlay đã ẨN.", flush=True)
                enqueue_beep(600, 80)  # Tiếng bíp trầm báo ẩn
            else:
                app.deiconify()
                app.lift()
                app.attributes("-topmost", True)
                app.focus_force()
                is_visible[0] = True
                print("[Hotkey F9] Overlay đã HIỆN nổi trên màn hình.", flush=True)
                enqueue_beep(1200, 100) # Tiếng bíp cao báo hiện
        except Exception as e:
            print(f"[Hotkey Error] {e}", flush=True)

    def hotkey_polling_loop():
        # Gắn luồng lắng nghe phím vào cùng desktop tương tác của người dùng
        if h_desk:
            try:
                ctypes.windll.user32.SetThreadDesktop(int(h_desk))
            except Exception:
                pass

        last_f9 = 0.0
        last_f10 = 0.0

        # Làm sạch cờ trạng thái trước khi vào vòng lặp
        ctypes.windll.user32.GetAsyncKeyState(VK_F9)
        ctypes.windll.user32.GetAsyncKeyState(VK_F10)

        while True:
            now = time.time()
            # 1. Kiểm tra phím F9
            state_f9 = ctypes.windll.user32.GetAsyncKeyState(VK_F9)
            if (state_f9 & 1 or state_f9 & 0x8000) and (now - last_f9 > 0.35):
                last_f9 = now
                app.after(0, toggle_overlay)

            # 2. Kiểm tra phím F10
            state_f10 = ctypes.windll.user32.GetAsyncKeyState(VK_F10)
            if (state_f10 & 1 or state_f10 & 0x8000) and (now - last_f10 > 0.35):
                last_f10 = now
                print("[Hotkey F10] Đang quét làm mới danh mục kèo giao dịch...", flush=True)
                enqueue_beep(900, 90)
                app.after(0, app.refresh_arbitrage_list)

            time.sleep(0.04)

    # Khởi chạy luồng giám sát phím nóng
    hk_thread = threading.Thread(target=hotkey_polling_loop, daemon=True)
    hk_thread.start()
    print("[Hotkey] Đã kích hoạt hệ thống phím nóng toàn cục (Kèm âm báo Audio Beep):\n  -> F9: Ẩn / Hiện Overlay HUD\n  -> F10: Quét làm mới cơ hội thị trường", flush=True)

def main():
    print("=" * 60, flush=True)
    print("   ⚔️  POE2 REALTIME TRADING ADVISOR & OVERLAY HUD  ⚔️", flush=True)
    print("   Chuẩn hóa cơ chế Path of Exile 2 - An toàn ToS 100%", flush=True)
    print("=" * 60, flush=True)

    # 0. Kết nối luồng chính vào Desktop tương tác của người dùng
    h_desk = attach_to_default_desktop()

    # 1. Tìm đường dẫn file nhật ký Client.txt
    log_path = Config.get_existing_log_path()
    if os.path.exists(log_path):
        print(f"[LogSensor] Đã phát hiện file nhật ký game tại:\n  -> {log_path}", flush=True)
    else:
        print(f"[LogSensor] Chưa thấy game chạy tại {log_path}. Chế độ chờ kết nối tự động...", flush=True)

    # 2. Khởi tạo các module
    gold_tracker = GoldTracker(initial_gold=50000)
    log_watcher = LogWatcher(log_path=log_path)
    market_advisor = MarketAdvisor(gold_tracker=gold_tracker)
    core_bridge = CoreShmBridge(low_hp_threshold=35.0)

    # Khởi động thread lắng nghe Client.txt
    log_watcher_started = log_watcher.start()
    if log_watcher_started:
        print("[LogWatcher] Luồng giám sát thời gian thực Client.txt đã bắt đầu hoạt động.", flush=True)
    else:
        print("[LogWatcher] File log chưa sẵn sàng. Chế độ giả lập sự kiện nội bộ sẵn sàng.", flush=True)

    # 3. Khởi tạo giao diện đồ họa Overlay HUD trên Desktop Default
    print("[HUD] Đang hiển thị Giao diện Overlay HUD bán trong suốt...", flush=True)
    app = OverlayHUD(
        gold_tracker=gold_tracker,
        log_watcher=log_watcher,
        market_advisor=market_advisor,
        core_bridge=core_bridge
    )

    # Đưa cửa sổ lên phía trước
    app.lift()
    app.attributes("-topmost", True)
    app.focus_force()

    # Đăng ký phím nóng F9 / F10
    setup_global_hotkeys(app, h_desk=h_desk)

    # 4. Chạy vòng lặp giao diện
    try:
        app.mainloop()
    finally:
        print("[Shutdown] Đang dừng dịch vụ và thu dọn tài nguyên...", flush=True)
        core_bridge.stop()
        log_watcher.stop()
        print("[Shutdown] Đã đóng thành công.", flush=True)

if __name__ == "__main__":
    main()
