"""Runs ON gex44 (GPU). usage: measure_probe.py <site_url> <out_dir>
Loads browse/render.html, renders every asset of index.json: <out>/thumbs/<glb sha>.jpg + <out>/measured.json
({glb: {size, min, max, scaled, tris, draws, clips}}) + <out>/report.json (errors, timings)."""
import asyncio, json, os, sys, time
from playwright.async_api import async_playwright
GPU = ['--no-sandbox', '--use-angle=gl-egl', '--use-gl=angle', '--ignore-gpu-blocklist', '--enable-gpu']


async def main(url, out):
    os.makedirs(f'{out}/thumbs', exist_ok=True)
    rep = {'errors': [], 'page_errors': [], 'console_errors': [], 'started': time.time()}
    measured = {}
    async with async_playwright() as p:
        b = await p.chromium.launch(args=GPU)
        pg = await b.new_page(viewport={'width': 512, 'height': 512})
        pg.on('pageerror', lambda e: rep['page_errors'].append(str(e)[:300]))
        pg.on('console', lambda msg: rep['console_errors'].append(msg.text[:2000]) if msg.type == 'error' else None)
        await pg.goto(url + 'render.html')
        await pg.wait_for_function('window.__ready === true', timeout=60000)
        n = await pg.evaluate('window.__index.assets.length')
        rep['renderer'] = await pg.evaluate("(() => { const g = document.createElement('canvas').getContext('webgl2'); "
                                            "const d = g.getExtension('WEBGL_debug_renderer_info'); "
                                            "return d ? g.getParameter(d.UNMASKED_RENDERER_WEBGL) : 'unknown'; })()")
        for i in range(n):
            r = await pg.evaluate(f'window.__go({i})')
            if not r.get('ok'):
                rep['errors'].append(r); continue
            await pg.wait_for_timeout(30)
            await pg.locator('#c').screenshot(path=f"{out}/thumbs/{r['glb']}.jpg", type='jpeg', quality=86)
            measured[r['glb']] = {k: r[k] for k in ('size', 'min', 'max', 'scaled', 'tris', 'draws', 'clips')}
        await b.close()
    rep['seconds'] = round(time.time() - rep['started'], 1); rep['measured'] = len(measured)
    json.dump(measured, open(f'{out}/measured.json', 'w'))
    json.dump(rep, open(f'{out}/report.json', 'w'), indent=1)
    print(json.dumps({k: rep[k] for k in ('seconds', 'measured', 'renderer')}), len(rep['errors']), 'errors',
          len(rep['page_errors']), 'page errors')

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