import json
from pathlib import Path

from playwright.sync_api import sync_playwright


ROOT = Path(__file__).resolve().parents[1]
ARTIFACTS = ROOT / "artifacts"
ARTIFACTS.mkdir(exist_ok=True)


def verify_page(page, viewport_name):
    errors = []
    page.on("console", lambda message: errors.append(message.text) if message.type == "error" else None)
    page.on("pageerror", lambda error: errors.append(str(error)))
    page.goto("http://127.0.0.1:4173", wait_until="networkidle")
    page.get_by_role("heading", name="GPU Cloud Economics").wait_for()
    page.get_by_text("A GPU cloud is a factory for intelligence.").wait_for()
    page.locator(".recharts-responsive-container svg").first.wait_for()

    page_height = page.evaluate("document.documentElement.scrollHeight")
    viewport_height = page.viewport_size["height"]
    for y_position in range(0, page_height, max(300, int(viewport_height * 0.72))):
        page.evaluate(f"window.scrollTo(0, {y_position})")
        page.wait_for_timeout(55)
    page.evaluate("window.scrollTo(0, 0)")
    page.wait_for_timeout(900)

    overflow = page.evaluate(
        "document.documentElement.scrollWidth - document.documentElement.clientWidth"
    )
    if overflow > 2:
        raise AssertionError(f"{viewport_name} has {overflow}px horizontal overflow")

    page.screenshot(
        path=str(ARTIFACTS / f"gpu-cloud-{viewport_name}.png"),
        full_page=True,
    )
    if viewport_name == "desktop":
        page.locator("#value").screenshot(path=str(ARTIFACTS / "gpu-cloud-value.png"))
        page.locator(".throughput-section").screenshot(
            path=str(ARTIFACTS / "gpu-cloud-throughput.png")
        )
        page.locator("#fleet").screenshot(path=str(ARTIFACTS / "gpu-cloud-fleet.png"))
    return errors


with sync_playwright() as playwright:
    browser = playwright.chromium.launch(headless=True)

    desktop = browser.new_page(viewport={"width": 1440, "height": 1000}, device_scale_factor=1)
    desktop_errors = verify_page(desktop, "desktop")

    desktop.get_by_role("button", name="Token demand", exact=True).first.click()
    desktop.wait_for_timeout(250)
    modeled_capacity = desktop.locator(".opening-metrics > div").first.inner_text()
    if "800 MW" not in modeled_capacity:
        raise AssertionError(f"Expected fixed-demand capacity to be 800 MW, got: {modeled_capacity}")

    desktop.get_by_role("button", name="Advanced assumptions").click()
    desktop.get_by_text("Paid GPU utilization").wait_for()
    desktop.locator("#model").screenshot(path=str(ARTIFACTS / "gpu-cloud-model.png"))

    mobile = browser.new_page(viewport={"width": 390, "height": 844}, device_scale_factor=1)
    mobile_errors = verify_page(mobile, "mobile")

    report = {
        "desktop_console_errors": desktop_errors,
        "mobile_console_errors": mobile_errors,
        "desktop_modeled_capacity_after_toggle": modeled_capacity,
        "screenshots": [
            "artifacts/gpu-cloud-desktop.png",
            "artifacts/gpu-cloud-mobile.png",
            "artifacts/gpu-cloud-model.png",
        ],
    }
    (ARTIFACTS / "visual-check.json").write_text(json.dumps(report, indent=2))

    if desktop_errors or mobile_errors:
        raise AssertionError(f"Browser errors found: {desktop_errors + mobile_errors}")

    browser.close()

print("visual checks passed")
