"""Runs ON gex44 (GPU). usage: tank_states_probe.py <site_url> <out_dir> [slugs comma list]
Destructible tanks in browse/vehicles.html: one screenshot per damage state (healthy, hit, panels off, track + gun out,
wreck, turret blown off) + a moving-parts frame; <out>/report.json = per state what was shown, triangles, page errors."""
import asyncio, json, os, sys
from playwright.async_api import async_playwright
GPU = ['--no-sandbox', '--use-angle=gl-egl', '--use-gl=angle', '--ignore-gpu-blocklist', '--enable-gpu']
STATES = ('healthy', 'hit', 'stripped', 'immobilised', 'wreck', 'blown')


async def main(url, out, only=''):
    os.makedirs(out, exist_ok=True)
    rep = {'tanks': {}, 'page_errors': [], 'console': []}
    async with async_playwright() as p:
        b = await p.chromium.launch(args=GPU)
        pg = await b.new_page(viewport={'width': 1280, 'height': 760})
        pg.on('pageerror', lambda e: rep['page_errors'].append(str(e)[:300]))
        pg.on('console', lambda m: m.type in ('error', 'warning') and rep['console'].append(m.text[:300]))
        await pg.goto(url + 'vehicles.html')
        await pg.wait_for_function('window.__ready === true', timeout=180000)
        vs = [v for v in await pg.evaluate('window.__list') if v.get('damage_glb')]
        want = set(filter(None, only.split(',')))
        for v in vs:
            if want and v['slug'] not in want:
                continue
            r = {'show': await pg.evaluate(f"window.__show({json.dumps(v['id'])}, {{paint: 0}})")}
            for s in STATES:
                r[s] = await pg.evaluate(f"window.__state('{s}')")
                await pg.wait_for_timeout(500)
                await pg.locator('#c').screenshot(path=f"{out}/{v['slug']}-{s}.jpg", type='jpeg', quality=86)
            await pg.evaluate("window.__state('healthy')")
            await pg.evaluate(f"window.__show({json.dumps(v['id'])}, {{paint: 2, view: 'side'}})")
            await pg.evaluate('window.__freeze(0.7, 1.9)'); await pg.wait_for_timeout(400)
            await pg.locator('#c').screenshot(path=f"{out}/{v['slug']}-moving.jpg", type='jpeg', quality=86)
            await pg.reload(); await pg.wait_for_function('window.__ready === true', timeout=180000)
            rep['tanks'][v['slug']] = r
        await b.close()
    json.dump(rep, open(f'{out}/report.json', 'w'), indent=1)
    print(json.dumps({'n': len(rep['tanks']), 'page_errors': rep['page_errors'][:5], 'console': rep['console'][:8],
                      'states': {k: {s: (x.get(s) or {}).get('shown') for s in STATES} for k, x in rep['tanks'].items()}}, indent=1))

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