import ctypes, time
from PIL import ImageGrab
import win32gui

user32 = ctypes.windll.user32
hdesk = user32.OpenInputDesktop(0, False, 0x01FF)
if hdesk: user32.SetThreadDesktop(hdesk)

hwnd = 0xe207f6 # PID 30076

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):
    sc = user32.MapVirtualKeyW(vk, 0)
    lp_down = 1 | (sc << 16)
    lp_up = 1 | (sc << 16) | (3 << 30)
    user32.PostMessageW(hwnd, 0x0100, vk, lp_down)
    time.sleep(0.04)
    user32.PostMessageW(hwnd, 0x0101, vk, lp_up)
    time.sleep(0.04)

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

def capture(name):
    if win32gui.IsWindow(hwnd):
        rect = win32gui.GetWindowRect(hwnd)
        if rect[2] > rect[0] and rect[3] > rect[1]:
            img = ImageGrab.grab(bbox=rect, all_screens=True)
            img.save(rf"c:\Projects\JX\logs\{name}")
            print(f"Captured {name}")

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

# Step 1: Select "Trọn Vẹn Chữ Tình" on right pane
print("Selecting Trọn Vẹn Chữ Tình...")
click(610, 209)
time.sleep(0.2)
dblclick(610, 209)
time.sleep(0.4)

# Step 2: Confirm server selection
print("Clicking Xác định...")
click(260, 503)
time.sleep(2.0)

# Step 3: Fill username 'nguvansi'
print("Entering username 'nguvansi'...")
click(464, 302)
time.sleep(0.1)
for _ in range(30): send_key(0x08)
time.sleep(0.1)
for c in "nguvansi": send_char(c)
time.sleep(0.2)

# Step 4: Fill password 'Ngu123@@'
print("Entering password 'Ngu123@@'...")
send_key(0x09) # Tab
time.sleep(0.1)
for _ in range(30): send_key(0x08)
time.sleep(0.1)
for c in "Ngu123@@": send_char(c)
time.sleep(0.3)

capture("p30076_nguvansi_filled.png")

# Step 5: Submit login
print("Submitting login...")
send_key(0x0D) # Enter
time.sleep(4.0)

capture("p30076_nguvansi_submitted.png")

# Step 6: If character select screen, select Slot 1 and enter game
print("Selecting character Slot 1...")
click(250, 350)
time.sleep(0.2)
dblclick(250, 350)
time.sleep(0.5)
click(400, 545)
time.sleep(0.1)
send_key(0x0D)
time.sleep(3.0)

capture("p30076_in_game_attempt.png")

with open(r"c:\Projects\JX\logs\live_login_try.txt", "w") as f:
    f.write("COMPLETED\n")
