#!/usr/bin/env python3
"""
nav-tree spike validation — 4-scenario 2-test
- vanilla vs CDP
- real-user simulation (5 pages, with mouse) vs direct-link bot (1 page)
"""
import sys, subprocess, time, os, json
from playwright.sync_api import sync_playwright

BASE = "http://127.0.0.1:3457/spikes/nav-tree/site"
DEMO = "http://127.0.0.1:3457/spikes/nav-tree/demo.html"
PORT = 9360
CHROME = "/usr/bin/google-chrome"

def run(condition, scenario, use_cdp=False):
    """Run one scenario. condition='vanilla'|'cdp', scenario='realuser'|'directbot'"""
    print(f"\n--- {condition.upper()} / {scenario.upper()} ---")

    if use_cdp:
        udir = f"/tmp/cdp_navtree_{condition}_{scenario}"
        proc = subprocess.Popen([
            CHROME, "--headless=new", "--no-sandbox", "--disable-gpu",
            f"--remote-debugging-port={PORT}", f"--user-data-dir={udir}",
            "about:blank"
        ], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
        time.sleep(3)
        try:
            with sync_playwright() as p:
                browser = p.chromium.connect_over_cdp(f"http://localhost:{PORT}")
                ctx = browser.contexts[0] if browser.contexts else browser.new_context()
                page = ctx.pages[0] if ctx.pages else ctx.new_page()
                result = _run_scenario(page, scenario)
                browser.close()
        finally:
            proc.terminate()
            time.sleep(0.5)
            if proc.poll() is None: proc.kill()
    else:
        with sync_playwright() as p:
            b = p.chromium.launch(headless=True, args=[
                "--no-sandbox", "--disable-setuid-sandbox", "--disable-dev-shm-usage"
            ])
            ctx = b.new_context()
            page = ctx.new_page()
            result = _run_scenario(page, scenario)
            b.close()

    print(f"  pageCount: {result['pageCount']}")
    print(f"  childCount: {result['childCount']}")
    print(f"  rootPath: {result['rootPath']}")
    print(f"  childPaths: {result['childPaths']}")
    print(f"  interactionCount: {result['interactionCount']}")
    print(f"  verdict: {result['verdict']}")
    return result


def _run_scenario(page, scenario):
    if scenario == "realuser":
        # Simulate real user: visit pages in order, with brief dwell time
        page.goto(f"{BASE}/home.html", timeout=15000)
        page.wait_for_timeout(800)
        # Click some links (with mouse movement)
        page.mouse.move(400, 300)
        page.wait_for_timeout(200)
        try:
            page.click("#link-products", timeout=3000)
        except: page.goto(f"{BASE}/products.html", timeout=15000)
        page.wait_for_timeout(1000)
        page.mouse.move(500, 400)
        page.wait_for_timeout(200)
        try:
            page.click("#link-product-42", timeout=3000)
        except: page.goto(f"{BASE}/product.html?id=42", timeout=15000)
        page.wait_for_timeout(800)
        page.mouse.move(600, 500)
        page.wait_for_timeout(200)
        try:
            page.click("#btn-add-cart", timeout=3000)
        except: pass
        page.wait_for_timeout(500)
        try:
            page.click("#link-cart", timeout=3000)
        except: page.goto(f"{BASE}/cart.html", timeout=15000)
        page.wait_for_timeout(800)
        page.mouse.move(700, 350)
        page.wait_for_timeout(200)
        try:
            page.click("#link-checkout", timeout=3000)
        except: page.goto(f"{BASE}/checkout.html", timeout=15000)
        page.wait_for_timeout(800)

    elif scenario == "directbot":
        # Bot: directly load checkout, no prior pages
        page.goto(f"{BASE}/checkout.html", timeout=15000)
        page.wait_for_timeout(500)

    # Now load the demo page to read the tree state
    page.goto(DEMO, timeout=15000)
    page.wait_for_function("window.__dbReady === true", timeout=10000)
    page.wait_for_timeout(500)  # let the setInterval refresh
    result = page.evaluate("window.__dbResult")
    return result


if __name__ == "__main__":
    results = {}
    for condition in ["vanilla", "cdp"]:
        for scenario in ["directbot", "realuser"]:
            key = f"{condition}_{scenario}"
            results[key] = run(condition, scenario, use_cdp=(condition == "cdp"))

    # Compare
    print("\n" + "=" * 60)
    print("COMPARISON MATRIX")
    print("=" * 60)
    print(f"{'Condition':<25} {'Pages':<8} {'Children':<10} {'Root':<15} {'Verdict'}")
    print("-" * 60)
    for key, r in results.items():
        print(f"{key:<25} {r['pageCount']:<8} {r['childCount']:<10} {r['rootPath'] or '(none)':<15} {r['verdict']}")

    # Verdict logic
    print()
    print("VERIFICATION:")
    # Both real-user scenarios should show pageCount >= 4
    ru_v = results["vanilla_realuser"]
    ru_c = results["cdp_realuser"]
    db_v = results["vanilla_directbot"]
    db_c = results["cdp_directbot"]

    print(f"  Real-user simulation:")
    print(f"    vanilla: {ru_v['pageCount']} pages, {ru_v['childCount']} children, verdict={ru_v['verdict']}")
    print(f"    cdp:     {ru_c['pageCount']} pages, {ru_c['childCount']} children, verdict={ru_c['verdict']}")

    print(f"  Direct-link bot:")
    print(f"    vanilla: {db_v['pageCount']} pages, {db_v['childCount']} children, verdict={db_v['verdict']}")
    print(f"    cdp:     {db_c['pageCount']} pages, {db_c['childCount']} children, verdict={db_c['verdict']}")

    # The signal works if:
    # 1. Real-user scenarios show multi-page navigation (>=3 pages)
    # 2. Direct-link bot scenarios show only 1 page (only checkout)
    # 3. Both vanilla AND CDP produce consistent results (not CDP-divergent)

    if ru_v["pageCount"] >= 4 and ru_c["pageCount"] >= 4:
        print(f"\n  ✅ Real-user simulation correctly shows multi-page journey")
    else:
        print(f"\n  ❌ Real-user simulation FAILED — expected 4+ pages, got vanilla={ru_v['pageCount']}, cdp={ru_c['pageCount']}")

    if db_v["pageCount"] == 1 and db_c["pageCount"] == 1:
        print(f"  ✅ Direct-link bot correctly shows single page")
    else:
        print(f"  ❌ Direct-link bot FAILED — expected 1 page, got vanilla={db_v['pageCount']}, cdp={db_c['pageCount']}")

    if ru_v["verdict"] == ru_c["verdict"] and db_v["verdict"] == db_c["verdict"]:
        print(f"  ✅ Verdicts identical between vanilla and CDP (not browser-mode-specific)")
    else:
        print(f"  ❌ Verdicts DIFFER between vanilla and CDP")

    if (ru_v["pageCount"] >= 4 and ru_c["pageCount"] >= 4 and
        db_v["pageCount"] == 1 and db_c["pageCount"] == 1):
        print(f"\n  >>> SIGNAL VALIDATED <<<")
        sys.exit(0)
    else:
        print(f"\n  >>> SIGNAL FAILED VALIDATION <<<")
        sys.exit(1)
