"""Runs ON gex44. usage: settlement_probe.py <url_root> <out>: settlement.html, screenshots (top, plan, aerial, walk) of a
village on a hill, a town on a river and a city on a plain; then every tier x site once for the stats table (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']
SHOTS = [('village', 'hill', 3), ('town', 'river', 2), ('city', 'plain', 2)]
VIEWS = ['aerial', 'top', 'plan', 'walk']
DETAIL = (sys.argv[3] if len(sys.argv) > 3 else '') or None   # 'full' | 'lite' | unset = tier default (argv[3], set FAL_PROBE_ARG)
TIERS = ['hamlet', 'village', 'town', 'city']
SITES = ['plain', 'river', 'crossroads', 'hill', 'spur', 'coast']

async def main(root, out):
    errors, shots, table = [], {}, {}
    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 'landmarks.mjs' not in m.text and '404' not in m.text and errors.append(f'console: {m.text[:300]}'))
        await pg.goto(f'{root}settlement.html')
        await pg.wait_for_function('window.__ready === true', timeout=180000)
        for tier, site, seed in SHOTS:
            for view in VIEWS:
                await pg.evaluate(f"window.__show({json.dumps(tier)}, {json.dumps(site)}, {seed}, {json.dumps(view)}, {json.dumps(DETAIL)})")
                await pg.wait_for_timeout(1500)
                name = f'{tier}-{site}-{view}'
                await pg.screenshot(path=f'{out}/{name}.png')
                shots[name] = await pg.evaluate('window.__stats')
                if view == 'walk':   # a second eye-level shot: on the main street looking at the square
                    await pg.evaluate('window.__walkStreet()')
                    await pg.wait_for_timeout(800)
                    await pg.screenshot(path=f'{out}/{tier}-{site}-walkstreet.png')
                err = await pg.evaluate('window.__error || null')
                if err: errors.append(f'{name}: {str(err)[:300]}')
        for tier in TIERS:
            for site in SITES:
                await pg.evaluate(f"window.__show({json.dumps(tier)}, {json.dumps(site)}, 5, 'aerial', {json.dumps(DETAIL)})")
                table[f'{tier}/{site}'] = await pg.evaluate('window.__stats')
        await b.close()
    with open(f'{out}/stats.json', 'w') as f:
        json.dump({'errors': errors, 'shots': shots, 'table': table}, f, indent=1)
    print(f'shots: {len(shots)}  page errors: {len(errors)}')
    for k, s in table.items():
        print(f"{k:18s} buildings={s['buildings']:4d} calls={s['drawCalls']:4d} detail={s['detail']} tris={s['triangles']:9d} build={s['buildMs']:5d}ms plan={s['planMs']:4d}ms colliders={s['colliders']} grey={s['greyBoxes']}")
    for e in errors: print('  ' + e)

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