import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent.parent.parent.parent))

import socketserver
import threading
from tools.serve_web_pc import FreeExilePCRequestHandler
from playwright.sync_api import sync_playwright

server = socketserver.TCPServer(('127.0.0.1', 0), FreeExilePCRequestHandler)
port = server.server_address[1]
t = threading.Thread(target=server.serve_forever, daemon=True)
t.start()

try:
    with sync_playwright() as p:
        try:
            browser = p.chromium.launch(channel='msedge', headless=True)
        except Exception:
            browser = p.chromium.launch(headless=True)
            
        actions = [
            ("click", lambda page: page.mouse.click(960, 540)),
            ("KeyQ", lambda page: page.keyboard.press('KeyQ')),
            ("KeyW", lambda page: page.keyboard.press('KeyW')),
            ("KeyE", lambda page: page.keyboard.press('KeyE')),
            ("KeyR", lambda page: page.keyboard.press('KeyR')),
            ("Key1", lambda page: page.keyboard.press('1')),
            ("Space", lambda page: page.keyboard.press('Space')),
            ("KeyC", lambda page: page.keyboard.press('KeyC')),
            ("KeyI", lambda page: page.keyboard.press('KeyI')),
            ("Escape", lambda page: page.keyboard.press('Escape')),
        ]
        
        for name, act in actions:
            page = browser.new_page(viewport={'width': 1920, 'height': 1080})
            page.add_init_script("try { localStorage.setItem('fe_sim_mode', 'fullscreen'); } catch(err){}")
            page_errors = []
            page.on('pageerror', lambda e: page_errors.append(f"{e} \n {getattr(e, 'stack', '')}"))
            
            page.goto(f'http://127.0.0.1:{port}/index.html')
            page.wait_for_timeout(400)
            act(page)
            page.wait_for_timeout(300)
            
            print(f"Action '{name}': {len(page_errors)} errors")
            for pe in page_errors:
                print(f"   -> {pe}")
            page.close()

        browser.close()
finally:
    server.shutdown()
    server.server_close()
