#!/usr/bin/env python3
"""Screenshot the build viewer with chosen layers.

Usage: python tools/build_check.py houses/<slug>/build.html --only fnd,frm.sill --cam "x,y,z:tx,ty,tz" --name out [--hide site.land,...]
--only   layer ids to leave on (everything else off; site.ground stays on unless hidden); omit to keep the defaults
"""
import argparse, asyncio, pathlib, json
from playwright.async_api import async_playwright
ARGS=['--use-gl=angle','--use-angle=swiftshader','--enable-unsafe-swiftshader','--ignore-gpu-blocklist']
async def main(a):
    html=pathlib.Path(a.html).resolve(); out=html.parent/'renders'; out.mkdir(exist_ok=True)
    async with async_playwright() as p:
        b=await p.chromium.launch(args=ARGS); pg=await b.new_page(viewport={'width':1400,'height':900})
        errs=[]; pg.on('pageerror',lambda e: errs.append(str(e)))
        await pg.goto(html.as_uri()); await pg.wait_for_function('window.__viewer',timeout=30000); await pg.wait_for_timeout(2500)
        if a.only:
            await pg.evaluate("['site','fnd','frm','roof','skin'].forEach(id=>__viewer.layer(id,false)); __viewer.layer('site.ground',true)")
            for l in a.only.split(','): await pg.evaluate(f"__viewer.layer('{l}',true)")
        for l in filter(None,(a.hide or '').split(',')): await pg.evaluate(f"__viewer.layer('{l}',false)")
        pos,tgt=(list(map(float,s.split(','))) for s in a.cam.split(':'))
        await pg.evaluate(f"__viewer.goView('sw'); __viewer.setCamera({pos},{tgt})"); await pg.wait_for_timeout(2200)
        f=out/f'build_{a.name}.png'; await pg.screenshot(path=str(f)); print(f)
        if errs: print('PAGE ERRORS:',*errs,sep='\n  ')
        await b.close()
ap=argparse.ArgumentParser(); ap.add_argument('html'); ap.add_argument('--only'); ap.add_argument('--hide'); ap.add_argument('--cam',required=True); ap.add_argument('--name',required=True)
asyncio.run(main(ap.parse_args()))
