import threading
import time
import functools
import http.server
from pathlib import Path
from playwright.sync_api import sync_playwright

WEBAPP_DIR = Path('client/webapp').resolve()

class QuietHandler(http.server.SimpleHTTPRequestHandler):
    def log_message(self, format, *args):
        pass

server = http.server.ThreadingHTTPServer(('127.0.0.1', 8899), functools.partial(QuietHandler, directory=str(WEBAPP_DIR)))
server_thread = threading.Thread(target=server.serve_forever, daemon=True)
server_thread.start()

with sync_playwright() as p:
    browser = p.chromium.launch(channel='msedge', headless=True)
    page = browser.new_page()
    page.goto('http://127.0.0.1:8899/index.html')
    time.sleep(1)

    res1 = page.evaluate("window.UITemplateManager.has('modal-settings')")
    res2 = page.evaluate("window.UITemplateManager.has('settings')")
    res3 = page.evaluate("window.UITemplateManager.get('settings').length")
    res4 = page.evaluate("window.UITemplateManager.get('modal-settings').length")

    print(f"has('modal-settings'): {res1}")
    print(f"has('settings'): {res2}")
    print(f"get('settings').length: {res3}")
    print(f"get('modal-settings').length: {res4}")

    # Hide modal-char-create to test HUD buttons
    page.evaluate("() => { const el = document.getElementById('modal-char-create'); if (el) el.classList.add('hidden'); }")
    time.sleep(0.2)

    # Test combat QA dashboard toggle
    btn_qa = page.query_selector('#btn-toggle-combat-qa')
    print("btn-toggle-combat-qa found:", btn_qa is not None)
    if btn_qa:
        btn_qa.click()
        time.sleep(0.1)
        panel = page.query_selector('#combat-test-dashboard')
        is_visible = panel and not ('hidden' in (panel.get_attribute('class') or ''))
        print("combat-test-dashboard opened:", is_visible)
        btn_close = page.query_selector('#btn-close-combat-qa')
        if btn_close:
            btn_close.click()
            time.sleep(0.1)
            is_hidden = panel and ('hidden' in (panel.get_attribute('class') or ''))
            print("combat-test-dashboard closed:", is_hidden)

    # Test loadAndMount with remote template fetch
    # Remove modal-feedback from templates and DOM first
    load_res = page.evaluate('''async () => {
        delete window.UITemplateManager.templates['modal-feedback'];
        delete window.UITemplateManager.templates['feedback'];
        const el = document.getElementById('modal-feedback');
        if (el) el.remove();
        
        // Now try loadAndMount('feedback')
        const mounted1 = await window.UITemplateManager.loadAndMount('feedback');
        // And try loadAndMount('modal-feedback')
        const mounted2 = await window.UITemplateManager.loadAndMount('modal-feedback');
        return {
            mounted1: mounted1 !== null,
            mounted2: mounted2 !== null
        };
    }''')
    print("loadAndMount results:", load_res)

    # Test hotkeys and buttons
    buttons_to_test = [
        '#btn-open-character',
        '#btn-open-bag',
        '#btn-open-vault',
        '#btn-open-meridian',
        '#btn-open-hideout',
        '#btn-open-worldmap',
        '#btn-open-atlas',
        '#btn-open-war-fog',
        '#btn-open-dungeon',
        '#btn-open-quests',
        '#btn-open-divine-vault',
        '#btn-open-agent-orb',
        '#btn-open-season',
        '#btn-open-megashop',
        '#btn-open-account',
        '#btn-open-settings',
    ]

    for btn in buttons_to_test:
        el = page.query_selector(btn)
        assert el is not None, f"Button {btn} not found in DOM"
        el.click()
        time.sleep(0.05)
        # Press Escape or click close to dismiss open modal before next button
        page.keyboard.press('Escape')
        time.sleep(0.05)

    browser.close()
server.shutdown()
print("PLAYWRIGHT_TESTS_COMPLETED_SUCCESSFULLY")
