"""Runs ON gex44. usage: landmarks_probe.py <url_root> <out>: landmarks.html, a PNG per view (church x3 seeds, cathedral x2,
churchyard, a phone pass), window.__stats, fatal and console errors, stats.json."""
import asyncio, json, sys
from playwright.async_api import async_playwright
GPU = ['--no-sandbox', '--use-angle=gl-egl', '--use-gl=angle', '--ignore-gpu-blocklist', '--enable-gpu']
SETTLE_MS = 1500
PLAN = [('church', 1), ('church', 2), ('church', 3), ('cathedral', 1), ('cathedral', 2), ('yard', 1), ('yard', 4)]

async def main(root, out):
    errors, shots, fatal = [], {}, None
    async with async_playwright() as p:
        b = await p.chromium.launch(args=GPU)
        pg = await b.new_page(viewport={'width': 1600, 'height': 900})
        pg.on('pageerror', lambda e: errors.append(f'page: {str(e)[:300]}'))
        pg.on('console', lambda m: m.type == 'error' and errors.append(f'console: {m.text[:300]}'))
        await pg.goto(f'{root}landmarks.html')
        try:
            await pg.wait_for_function('window.__ready === true', timeout=120000)
        except Exception as e:
            fatal = str(e)[:200]
        if not fatal:
            for view, seed in PLAN:
                name = f'{view}-{seed}'
                await pg.evaluate(f'window.__show({json.dumps(view)}, {seed})')
                await pg.wait_for_timeout(SETTLE_MS)
                await pg.screenshot(path=f'{out}/{name}.png')
                shots[name] = await pg.evaluate('window.__stats')
                err = await pg.evaluate('window.__error || null')
                if err:
                    errors.append(f'{name}: {str(err)[:300]}')
        ctx = await b.new_context(viewport={'width': 390, 'height': 844}, device_scale_factor=2)
        mp = await ctx.new_page()
        mp.on('pageerror', lambda e: errors.append(f'phone page: {str(e)[:300]}'))
        await mp.goto(f'{root}landmarks.html')
        try:
            await mp.wait_for_function('window.__ready === true', timeout=120000)
            await mp.evaluate("window.__show('church', 1)")
            await mp.wait_for_timeout(SETTLE_MS)
            await mp.screenshot(path=f'{out}/phone-church.png')
        except Exception as e:
            errors.append(f'phone: {str(e)[:120]}')
        await b.close()
    with open(f'{out}/stats.json', 'w') as f:
        json.dump({'fatal': fatal, 'errors': errors, 'shots': shots}, f, indent=1)
    print(f'shots: {len(shots)}  fatal: {fatal}')
    for n, st in shots.items():
        print(f"{n:14s} inst={st['instances']} boxes={st['boxes']} calls={st['drawCalls']} errs={st['errors']} warn={st['warnings']} kits={st['kits']}")
    print(f'page errors: {len(errors)}')
    for e in errors:
        print('  ' + e)

asyncio.run(main(*sys.argv[1:3]))
