import sys, time, ctypes
import win32gui
from PIL import ImageGrab

sys.stdout.reconfigure(encoding='utf-8')
user32 = ctypes.windll.user32
hdesk = user32.OpenInputDesktop(0, False, 0x01FF)
if hdesk: user32.SetThreadDesktop(hdesk)

hwnd = 0x0063003A
print(f"Target HWND: 0x{hwnd:X}")

def make_lparam(x, y):
    return ((y & 0xFFFF) << 16) | (x & 0xFFFF)

def click(x, y):
    lp = make_lparam(x, y)
    user32.PostMessageW(hwnd, 0x0200, 0, lp)
    time.sleep(0.04)
    user32.PostMessageW(hwnd, 0x0201, 1, lp)
    time.sleep(0.08)
    user32.PostMessageW(hwnd, 0x0202, 0, lp)
    time.sleep(0.05)

def dblclick(x, y):
    lp = make_lparam(x, y)
    user32.PostMessageW(hwnd, 0x0200, 0, lp)
    time.sleep(0.03)
    user32.PostMessageW(hwnd, 0x0201, 1, lp)
    time.sleep(0.05)
    user32.PostMessageW(hwnd, 0x0202, 0, lp)
    time.sleep(0.06)
    user32.PostMessageW(hwnd, 0x0203, 1, lp)
    time.sleep(0.05)
    user32.PostMessageW(hwnd, 0x0202, 0, lp)
    time.sleep(0.05)

def send_key(vk):
    lp = (0x1C << 16) | 1
    user32.PostMessageW(hwnd, 0x0100, vk, lp)
    time.sleep(0.04)
    user32.PostMessageW(hwnd, 0x0101, vk, lp | (3 << 30))
    time.sleep(0.04)

def send_char(c):
    lp = (ord(c) << 16) | 1
    user32.PostMessageW(hwnd, 0x0102, ord(c), lp)
    time.sleep(0.04)

def capture(name):
    rect = win32gui.GetWindowRect(hwnd)
    img = ImageGrab.grab(bbox=rect, all_screens=True)
    path = rf"c:\Projects\JX\logs\{name}.png"
    img.save(path)
    print(f"Captured: {path}")

user32.SetForegroundWindow(hwnd)
time.sleep(0.2)

# Currently on Server Selection screen. Confirm server:
print("Double click Trọn Vẹn Chữ Tình...")
click(610, 209)
time.sleep(0.2)
dblclick(610, 209)
time.sleep(0.3)
click(260, 503) # Xác định
time.sleep(0.1)
send_key(0x0D)
time.sleep(2.5)
capture("test_login_dialog_opened")

# Focus Username:
print("Focusing username...")
click(450, 297)
time.sleep(0.1)
send_key(0x26) # VK_UP
time.sleep(0.1)
click(450, 297)
time.sleep(0.1)

# Clear username
send_key(0x23) # VK_END
for _ in range(25): send_key(0x08)
send_key(0x24) # VK_HOME
for _ in range(25): send_key(0x2E)
time.sleep(0.1)

print("Typing username nguvansi1...")
for c in "nguvansi1":
    send_char(c)
time.sleep(0.2)
capture("test_username_typed")

# Focus Password:
print("Focusing password...")
click(450, 330)
time.sleep(0.1)
send_key(0x28) # VK_DOWN
time.sleep(0.1)
click(450, 330)
time.sleep(0.1)

# Clear password
send_key(0x23) # VK_END
for _ in range(25): send_key(0x08)
send_key(0x24) # VK_HOME
for _ in range(25): send_key(0x2E)
time.sleep(0.1)

print("Typing password Ngu123@@...")
for c in "Ngu123@@":
    send_char(c)
time.sleep(0.2)
capture("test_both_typed")

# Submit credentials
print("Submitting login...")
click(300, 418)
time.sleep(0.1)
send_key(0x0D)
time.sleep(4.0)
capture("test_after_submit")

# Select Slot 1 (ConCuaBoMe)
print("Selecting Slot 1...")
click(250, 350)
time.sleep(0.2)
dblclick(250, 350)
time.sleep(0.3)
click(92, 561) # Vào trò chơi
time.sleep(0.1)
send_key(0x0D)
time.sleep(5.0)

# Dismiss in-game popup
click(300, 570)
time.sleep(0.2)
send_key(0x1B) # VK_ESCAPE
time.sleep(1.0)
capture("test_in_game_final")
print("Done!")
