"""
scripts/recover_client_scene.py
Phục hồi hiện trường game client tức thời theo chỉ thị của Sư đoàn 5:
- Focus cửa sổ POE2.
- Gửi phím ESC / SPACE để đóng menu Options hoặc modal dialog.
- Mở túi đồ (phím 'I'), click trả item (nếu con trỏ đang giữ item), đóng túi đồ ('I').
- Kiểm chứng hiện trường sạch tại Shoreline Hideout.
"""

import os
import sys
import time
from pathlib import Path
from PIL import Image

try:
    if hasattr(sys.stdout, "reconfigure"):
        sys.stdout.reconfigure(encoding="utf-8")
        sys.stderr.reconfigure(encoding="utf-8")
except Exception:
    pass

sys.path.insert(0, str(Path(__file__).resolve().parent.parent))

from src.common.win32_window import find_poe2_window, ensure_window_focus, get_client_rect, is_poe2_window_focused
import src.common.win32_input as win32_input
from src.common.win32_input import press_key, click, VK_ESCAPE, VK_SPACE, VK_I, SC_ESCAPE, SC_SPACE, SC_I
from src.common.screen_capture import capture_window_bitblt
import src.common.vision_ocr as vision_ocr


def recover_scene():
    hwnd = find_poe2_window()
    if not hwnd:
        print("[Recover] ❌ Không tìm thấy cửa sổ POE2!")
        return False

    print(f"[Recover] 🎯 Target HWND: 0x{hwnd:X}. Đang focus cửa sổ...")
    ensure_window_focus(hwnd)
    time.sleep(0.5)

    cl, ct, cw, ch = get_client_rect(hwnd)
    print(f"[Recover] Client Rect: ({cl}, {ct}, {cw}, {ch})")

    # 1. Gửi phím ESC và SPACE để đóng Options Menu / Modals
    print("[Recover] Gửi ESC và SPACE để đóng Options Menu / Modal Dialogs...")
    press_key(VK_ESCAPE, SC_ESCAPE, hold_ms=0.05, delay_after=0.2, hwnd=hwnd)
    press_key(VK_SPACE, SC_SPACE, hold_ms=0.05, delay_after=0.2, hwnd=hwnd)
    time.sleep(0.5)

    # 2. Xử lý trường hợp con trỏ dính item: mở túi đồ 'I', click trả item vào ô trống, đóng 'I'
    print("[Recover] Mở túi đồ (phím 'I') để kiểm tra / thả item dính chuột...")
    press_key(VK_I, SC_I, hold_ms=0.05, delay_after=0.5, hwnd=hwnd)
    time.sleep(0.5)

    # Click vào ô trống trong túi đồ (ô cuối túi đồ: khoảng 95% width, 75% height)
    slot_x = cl + int(cw * 0.94)
    slot_y = ct + int(ch * 0.72)
    print(f"[Recover] Click trả item vào slot túi đồ ({slot_x}, {slot_y})...")
    click(slot_x, slot_y, button="left", hold_ms=0.05, delay_after=0.3)
    time.sleep(0.3)

    # Đóng túi đồ
    print("[Recover] Đóng túi đồ (phím 'I')...")
    press_key(VK_I, SC_I, hold_ms=0.05, delay_after=0.3, hwnd=hwnd)
    press_key(VK_SPACE, SC_SPACE, hold_ms=0.05, delay_after=0.2, hwnd=hwnd)
    time.sleep(0.5)

    # 3. Chụp ảnh kiểm chứng hiện trường sạch
    os.makedirs("captures/recovery", exist_ok=True)
    out_img = "captures/recovery/POST_RECOVERY_CLEAN_STATE.png"
    cap = capture_window_bitblt(hwnd, client_only=True)
    if cap:
        cap.save(out_img)
        print(f"[Recover] 📸 Đã lưu ảnh hiện trường sau phục hồi: {out_img}")
        res = vision_ocr.safe_recognize_pil_sync(cap)
        ocr_text = " | ".join(l.get("text", "") for l in res.get("lines", []))
        print(f"[Recover] 🔍 OCR Hiện trường: {ocr_text[:300]}...")
        return True
    return False


if __name__ == "__main__":
    ok = recover_scene()
    sys.exit(0 if ok else 1)
