import ctypes
import os
import sys

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

is_admin = shell32.IsUserAnAdmin()
if not is_admin:
    print("Non-admin process: Re-launching elevated...")
    ret = shell32.ShellExecuteW(None, "runas", sys.executable, f'"{os.path.abspath(__file__)}" --elevated', None, 1)
    if ret > 32:
        sys.exit(0)

# Once elevated, ensure thread is attached to interactive default desktop
from src.common.win32_window import attach_to_default_desktop
attach_to_default_desktop()

# Try direct SendInput call with our struct
from src.common.win32_input import INPUT, INPUT_KEYBOARD, KEYEVENTF_SCANCODE
inp = INPUT()
inp.type = INPUT_KEYBOARD
inp.i.ki.wVk = VK_W
inp.i.ki.wScan = SC_W
inp.i.ki.dwFlags = KEYEVENTF_SCANCODE

kernel32.SetLastError(0)
ret = _user32.SendInput(1, ctypes.byref(inp), ctypes.sizeof(INPUT))
err = kernel32.GetLastError()
print(f"SendInput ret: {ret}, GetLastError: {err}")

# release
inp.i.ki.dwFlags = KEYEVENTF_SCANCODE | 0x0002
_user32.SendInput(1, ctypes.byref(inp), ctypes.sizeof(INPUT))

with open("debug_harness/sendinput_struct_test.txt", "w") as f:
    f.write(f"IsUserAnAdmin: {is_admin}\nSendInput ret: {ret}\nGetLastError: {err}\n")
