import socketserver
import threading
import sys
from pathlib import Path
from playwright.sync_api import sync_playwright

sys.path.insert(0, ".")
from tools.serve_web_pc import FreeExilePCRequestHandler

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

s = socketserver.TCPServer(("127.0.0.1", 0), SilentServer)
port = s.server_address[1]
t = threading.Thread(target=s.serve_forever, daemon=True)
t.start()

errors = []
console_logs = []

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.on("pageerror", lambda err: errors.append(f"PageError: {err}"))
    page.on("console", lambda m: errors.append(f"ConsoleError: {m.text}") if m.type == "error" and "favicon" not in m.text else console_logs.append(f"[{m.type}] {m.text}"))

    page.goto(f"http://127.0.0.1:{port}/index.html")
    page.wait_for_timeout(300)

    # 1. Verify #badge-iframe presence and classes
    badge_info = page.evaluate("""() => {
        const el = document.getElementById('badge-iframe');
        return {
            exists: !!el,
            tagName: el ? el.tagName : null,
            classList: el ? Array.from(el.classList) : [],
            innerText: el ? el.innerText : null
        };
    }""")
    print("Badge-iframe info:", badge_info)
    assert badge_info["exists"] is True, "#badge-iframe does not exist!"
    assert "hidden" in badge_info["classList"], "#badge-iframe should be hidden initially"

    # 2. Trigger Spacebar Dodge and wait for i-frame to expire
    page.keyboard.press("Space")
    page.wait_for_timeout(50)
    iframe_during = page.evaluate("() => window.player?.isIFrame")
    print("i-Frame active during dodge:", iframe_during)

    # Wait for i-frame timer to expire (> 0.25s)
    page.wait_for_function("() => !window.player?.isIFrame", timeout=2000)
    page.wait_for_timeout(50)
    iframe_after = page.evaluate("() => window.player?.isIFrame")
    badge_after_class = page.evaluate("() => Array.from(document.getElementById('badge-iframe')?.classList || [])")
    print("i-Frame after expiration:", iframe_after)
    print("Badge-iframe classList after expiration:", badge_after_class)
    assert iframe_after is False, "i-Frame did not expire!"
    assert "hidden" in badge_after_class, "badge-iframe should have 'hidden' added by canvas_renderer.js"

    # 3. Test sfxEngine.playWeaponSlash directly and via primary attack
    slash_fn_type = page.evaluate("() => typeof window.sfxEngine?.playWeaponSlash")
    print("sfxEngine.playWeaponSlash type:", slash_fn_type)
    assert slash_fn_type == "function", "sfxEngine.playWeaponSlash is not a function!"

    # Call playWeaponSlash directly
    slash_call_res = page.evaluate("""() => {
        try {
            window.sfxEngine.playWeaponSlash();
            return { ok: true };
        } catch (e) {
            return { ok: false, error: String(e) };
        }
    }""")
    print("Direct playWeaponSlash call result:", slash_call_res)
    assert slash_call_res["ok"] is True, f"playWeaponSlash failed: {slash_call_res}"

    # Call doPrimaryAttack if defined
    primary_call_res = page.evaluate("""() => {
        try {
            if (typeof window.doPrimaryAttack === 'function') {
                window.doPrimaryAttack();
                return { ok: true, called: true };
            }
            return { ok: true, called: false };
        } catch (e) {
            return { ok: false, error: String(e) };
        }
    }""")
    print("doPrimaryAttack call result:", primary_call_res)
    assert primary_call_res["ok"] is True, f"doPrimaryAttack failed: {primary_call_res}"

    browser.close()

s.shutdown()

print("Collected errors:", errors)
assert len(errors) == 0, f"Errors encountered during test: {errors}"
print("\nAUDIT CHECK 3 EMPIRICAL VERIFICATION: COMPLETE AND CLEAN")
