"""Disposable browser interaction checks. Run with tools/gpu/run.sh on its private loopback site."""
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']
async def main(root,out):
 errors=[]; report={}
 async with async_playwright() as p:
  browser=await p.chromium.launch(args=GPU)
  page=await browser.new_page(viewport={'width':1600,'height':900})
  page.on('pageerror',lambda e:errors.append(str(e)))
  await page.goto(root+'settlement.html?grass=0&tier=town&site=hill&seed=1&view=walk&ao=on')
  await page.wait_for_function('window.__ready === true',timeout=180000)
  await page.wait_for_timeout(2500)
  report['queryOff']=await page.evaluate('!__built().grass.enabled && !__built().grass.field')
  await page.get_by_role('button',name='grass: off',exact=True).click()
  await page.wait_for_function('__built().grass.field !== null',timeout=60000)
  await page.evaluate('__walkTo(-160,-160,.3,-.12);__look.setAO(true);')
  await page.wait_for_timeout(5000)
  report['fields']=await page.evaluate("__built().group.getObjectsByProperty('name','grass-field').length")
  await page.screenshot(path=out+'/trample-start.png')
  await page.evaluate('''window.__pressAt=(x,z)=>{const t=__built().grass.field.trample,i=Math.floor((x-t.origin[0])/t.size*t.res),j=Math.floor((z-t.origin[1])/t.size*t.res);return t.data[(j*t.res+i)*4+2]||0;};window.__start=__walkPos();window.__windStart=__built().grass.field.uniforms.uTime.value;''')
  report['start']=await page.evaluate('({...__start,press:__pressAt(__start.x,__start.z)})')
  await page.keyboard.down('w');await page.wait_for_timeout(1500);await page.keyboard.up('w')
  report['moved']=await page.evaluate('({...__walkPos(),pressAtStart:__pressAt(__start.x,__start.z)})')
  await page.wait_for_timeout(2000)
  report['recovery']=await page.evaluate('({pressAtStart:__pressAt(__start.x,__start.z),windTimeAdvanced:__built().grass.field.uniforms.uTime.value>__windStart+2,windStrength:__built().grass.field.uniforms.uWindStr.value})')
  await page.screenshot(path=out+'/trample-after.png')
  await page.get_by_role('button',name='grass: on',exact=True).click()
  await page.wait_for_timeout(800)
  report['buttonOff']=await page.evaluate('!__built().grass.enabled && !__built().grass.field.group.visible')
  await page.get_by_role('button',name='grass: off',exact=True).click()
  await page.wait_for_timeout(1000)
  report['buttonOn']=await page.evaluate('__built().grass.enabled && __built().grass.field.group.visible')
  report['singleFieldAfterToggle']=await page.evaluate("__built().group.getObjectsByProperty('name','grass-field').length===1")
  report['errors']=errors
  json.dump(report,open(out+'/interaction.json','w'),indent=2);print(json.dumps(report))
  await browser.close()
asyncio.run(main(*sys.argv[1:3]))
