import socketserver
import threading
import sys
from pathlib import Path

PROJECT_ROOT = Path(__file__).resolve().parent.parent.parent.parent
sys.path.insert(0, str(PROJECT_ROOT))
from tools.serve_web_pc import FreeExilePCRequestHandler

class SilentServer(FreeExilePCRequestHandler):
    def log_message(self, *args):
        pass

srv = socketserver.TCPServer(('127.0.0.1', 0), SilentServer)
t = threading.Thread(target=srv.serve_forever, daemon=True)
t.start()
url = f"http://127.0.0.1:{srv.server_address[1]}"

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(channel="msedge", headless=True)
    page = browser.new_page(viewport={"width": 1920, "height": 1080})
    
    def on_err(err):
        print("=== PAGE ERROR OCCURRED ===")
        print(f"Message: {err.message}")
        print(f"Name: {err.name}")
        print(f"Stack:\n{err.stack}")
        print("============================")
        
    page.on("pageerror", on_err)
    page.add_init_script("""
        try {
            localStorage.setItem('fe_sim_mode', 'fullscreen');
            localStorage.setItem('freeexile_auth_session', JSON.stringify({
                account_id: 'acc_challenger_test',
                username: 'ChallengerPC',
                status: 'ACTIVE'
            }));
            localStorage.setItem('fe_chars_acc_challenger_test', JSON.stringify([
                { character_id: 'char_challenger_1', character_name: '劍神', character_class: 'char_sword_master', level: 1 }
            ]));
            localStorage.setItem('freeexile_active_char_id', 'char_challenger_1');
        } catch(e){}
    """)
    page.goto(f"{url}/index.html")
    page.wait_for_timeout(300)
    
    print("\n--- 1. Multi-Resolution Resizing ---")
    page.set_viewport_size({"width": 2560, "height": 1080})
    page.wait_for_timeout(50)
    page.set_viewport_size({"width": 1920, "height": 1080})
    page.wait_for_timeout(50)

    print("\n--- 2. Rapid Language Cycling ---")
    for lang in ["vi", "en", "zh", "ja", "ko", "th", "de", "ru", "es"]:
        page.select_option("#lang-select", lang)
        page.wait_for_timeout(20)

    print("\n--- 3. Dual Docking C and I ---")
    page.keyboard.press("KeyC")
    page.wait_for_timeout(50)
    page.keyboard.press("KeyI")
    page.wait_for_timeout(50)
    page.keyboard.press("KeyC")
    page.wait_for_timeout(50)
    page.keyboard.press("KeyI")
    page.wait_for_timeout(50)

    print("\n--- 4. Gameplay Interactions ---")
    print("Click move:")
    page.mouse.click(1040, 580)
    page.wait_for_timeout(40)

    print("RMB attack:")
    page.mouse.click(900, 600, button="right")
    page.wait_for_timeout(40)

    print("Flasks 1-5:")
    for f in ["1", "2", "3", "4", "5"]:
        page.keyboard.press(f)
        page.wait_for_timeout(20)

    print("Skills Q, W, E, R:")
    for k in ["KeyQ", "KeyW", "KeyE", "KeyR"]:
        page.keyboard.press(k)
        page.wait_for_timeout(30)

    print("Space dodge:")
    page.keyboard.press("Space")
    page.wait_for_timeout(40)

    print("Slot hovers:")
    for slot_id in ["#skill-flask-1", "#skill-flask-2", "#skill-flask-3", "#skill-flask-4", "#skill-flask-5",
                    "#skill-q", "#skill-w", "#skill-e", "#skill-r", "#skill-lmb", "#skill-rmb", "#skill-dodge"]:
        slot = page.locator(slot_id)
        if slot.count() > 0:
            slot.hover(force=True)
            page.wait_for_timeout(20)

    page.wait_for_timeout(300)
    browser.close()

srv.shutdown()
srv.server_close()
