import time
import ctypes
import struct

user32 = ctypes.windll.user32
kernel32 = ctypes.windll.kernel32

hwinsta = user32.OpenWindowStationW("WinSta0", False, 0x10000000)
if hwinsta: user32.SetProcessWindowStation(hwinsta)
hdesk = user32.OpenDesktopW("Default", 0, False, 0x10000000)
if hdesk: user32.SetThreadDesktop(hdesk)

hwnd = user32.FindWindowW("POEWindowClass", None)
user32.ShowWindow(hwnd, 9)
user32.SetForegroundWindow(hwnd)
user32.BringWindowToTop(hwnd)
time.sleep(0.2)

# Click top border to establish physical focus
user32.SetCursorPos(1280, 5)
time.sleep(0.05)
user32.mouse_event(0x0002, 0, 0, 0, 0)
time.sleep(0.05)
user32.mouse_event(0x0004, 0, 0, 0, 0)
time.sleep(0.4)

def read_xyz():
    pid = 43084
    h = kernel32.OpenProcess(0x0010, False, pid)
    if not h: return None
    buf = ctypes.create_string_buffer(12)
    br = ctypes.c_size_t()
    kernel32.ReadProcessMemory(h, ctypes.c_void_p(0x2AF791A0550), buf, 12, ctypes.byref(br))
    kernel32.CloseHandle(h)
    return struct.unpack("<fff", buf.raw)

xyz0 = read_xyz()
print(f"XYZ Before: {xyz0}")

# Move cursor towards North-East (1800, 600)
user32.SetCursorPos(1800, 600)
time.sleep(0.1)

# Press 'W' and 'D' for 1500ms
print("Holding 'W' + 'D' for 1500ms...")
user32.keybd_event(0x57, 0x11, 0, 0) # W down
user32.keybd_event(0x44, 0x20, 0, 0) # D down
time.sleep(1.5)
user32.keybd_event(0x57, 0x11, 2, 0) # W up
user32.keybd_event(0x44, 0x20, 2, 0) # D up
print("Released 'W' + 'D'")

time.sleep(0.3)
xyz1 = read_xyz()
print(f"XYZ After: {xyz1}")
dx = xyz1[0] - xyz0[0]
dy = xyz1[1] - xyz0[1]
print(f"Delta: dX={dx:.2f}, dY={dy:.2f}")

import sys
sys.path.insert(0, r"C:\Projects\AutoPOE2")
from tools.autonomous_map_runner import ScreenCapturerGDI
c = ScreenCapturerGDI()
c.capture(r"C:\Projects\AutoPOE2\captures\test_wasd_after_focus_result.png")
print("Captured test_wasd_after_focus_result.png")
