import time
import ctypes
import os
import sys
import traceback
from pathlib import Path

log_file = r"C:\Projects\AutoPOE2\scratch\wasd_log.txt"

def log(msg):
    with open(log_file, "a", encoding="utf-8") as f:
        f.write(str(msg) + "\n")
    print(msg)

def main():
    try:
        with open(log_file, "w", encoding="utf-8") as f:
            f.write("=== WASD Movement Test ===\n")
        
        sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
        from tools.autonomous_map_runner import ScreenCapturerGDI, SafeMemoryReader

        user32 = ctypes.windll.user32
        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)
        if not hwnd:
            hwnd = user32.FindWindowW(None, "Path of Exile 2")
        log(f"HWND: {hwnd}")
        if hwnd:
            user32.ShowWindow(hwnd, 9)
            user32.SetForegroundWindow(hwnd)
            time.sleep(0.3)

        reader = SafeMemoryReader()
        init_ok = reader.init_process()
        log(f"MemoryReader init: {init_ok}")
        p_before = reader.read_player_telemetry()
        log(f"Before: Pos=({p_before['x']:.2f}, {p_before['y']:.2f}, {p_before['z']:.2f}), HP={p_before['hp']}/{p_before['max_hp']}, ES={p_before['es']}/{p_before['max_es']}")

        # Press Escape to close any popup/menu (skills menu / slot popup)
        log("Pressing ESC to close popup...")
        user32.keybd_event(0x1B, 0, 0, 0) # ESC
        time.sleep(0.08)
        user32.keybd_event(0x1B, 0, 2, 0)
        time.sleep(0.4)

        # Press 'D' (move right, VK 0x44, scan code 0x20)
        log("Holding 'D' key for 500ms...")
        user32.keybd_event(0x44, 0x20, 0, 0)
        time.sleep(0.5)
        user32.keybd_event(0x44, 0x20, 2, 0)
        time.sleep(0.4)

        p_after = reader.read_player_telemetry()
        log(f"After: Pos=({p_after['x']:.2f}, {p_after['y']:.2f}, {p_after['z']:.2f})")
        dx = p_after['x'] - p_before['x']
        dy = p_after['y'] - p_before['y']
        dist = (dx*dx + dy*dy)**0.5
        log(f"Displacement: dx={dx:.2f}, dy={dy:.2f}, dist={dist:.2f}")

        c = ScreenCapturerGDI()
        out_dir = r"C:\Projects\AutoPOE2\captures"
        os.makedirs(out_dir, exist_ok=True)
        out_path = os.path.join(out_dir, "test_wasd_movement.png")
        c.capture(out_path)
        log(f"Saved {out_path}")
    except Exception as e:
        log(f"Exception: {e}")
        log(traceback.format_exc())

if __name__ == "__main__":
    main()
