"""
Targeted Verification for Key W Decoupling Isolation and Dodge Charges.
"""
from __future__ import annotations
import math
import socketserver
import sys
import threading
from pathlib import Path
from typing import Any

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


class SilentPCServer(FreeExilePCRequestHandler):
    def log_message(self, format: str, *args: Any) -> None:
        pass


def test_w_isolation_and_charges():
    server = socketserver.TCPServer(("127.0.0.1", 0), SilentPCServer)
    port = server.server_address[1]
    threading.Thread(target=server.serve_forever, daemon=True).start()
    base_url = f"http://127.0.0.1:{port}"

    try:
        with sync_playwright() as p:
            try:
                browser = p.chromium.launch(channel="msedge", headless=True)
            except Exception:
                browser = p.chromium.launch(headless=True)

            page = browser.new_page(viewport={"width": 1920, "height": 1080})
            page.add_init_script("try { localStorage.setItem('fe_sim_mode', 'fullscreen'); } catch(e){}")
            page.goto(f"{base_url}/index.html")
            page.wait_for_function("() => window.player && window.PcInputController")

            # 1. Test W isolation from pure standstill
            page.evaluate("""() => {
                if (window.player.destination) window.player.destination.active = false;
                window.player.dirX = 0;
                window.player.dirY = 0;
            }""")
            p_start = page.evaluate("() => ({ wx: window.player.wx, wy: window.player.wy })")
            
            # Press and hold W for 500ms
            page.keyboard.down("KeyW")
            page.wait_for_timeout(500)
            page.keyboard.up("KeyW")
            p_end = page.evaluate("() => ({ wx: window.player.wx, wy: window.player.wy })")
            drift = math.hypot(p_end['wx'] - p_start['wx'], p_end['wy'] - p_start['wy'])
            print(f"[TEST W STANDSTILL DRIFT]: {drift}")

            # 2. Test Dodge Charges on Single Spacebar Press
            init_charges = page.evaluate("() => window.skillBarController?.slots?.get('dodge')?.charges")
            print(f"[INIT DODGE CHARGES]: {init_charges}")
            
            page.keyboard.press("Space")
            page.wait_for_timeout(50)
            post_dodge1_charges = page.evaluate("() => window.skillBarController?.slots?.get('dodge')?.charges")
            print(f"[CHARGES AFTER 1 SPACE PRESS]: {post_dodge1_charges}")

            # 3. Test Missing badge-iframe crash
            # Wait for iFrame to expire (> 250ms)
            errors = []
            page.on("pageerror", lambda err: errors.append(str(err)))
            page.wait_for_timeout(300)
            print(f"[PAGE ERRORS AFTER IFRAME EXPIRY]: {errors}")

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


if __name__ == "__main__":
    test_w_isolation_and_charges()
