#!/usr/bin/env python3
import json, os, socketserver, threading, http.server, time, urllib.parse
from pathlib import Path
from playwright.sync_api import sync_playwright
ROOT=Path('/mnt/data/v318root/NEXT11_V318_ACTUAL_CALF_MESH_AUTHORITY_GATE_ROOT'); OUT=ROOT/'diagnostics/v318'; OUT.mkdir(parents=True,exist_ok=True)
class Q(http.server.SimpleHTTPRequestHandler):
 def log_message(self,*a): pass
EVAL="""() => {const d=window.__NEXPROD01_DEBUG_SCENE||null,g=window.__NEXPROD01_V318_ACTUAL_CALF_PALM_MESH_TRUTH||null,p=window.__NEXPROD01_V311_ACTUAL_MCP_PALM_PREFINGER_GATE||window.__NEXPROD01_V308_ACTUAL_MCP_PALM_PREFINGER_GATE||null,f=window.__NEXPROD01_V301_FINGER_CHILD_LAYER_GATE||null,r=window.__NEXPROD01_GRIP_SOLVER_V1||null;return {hasModel:!!d?.model,side:r?.side||null,runtimeVersion:r?.version||null,mesh:g,prefinger:p?{schema:p.schema,pass:p.pass,status:p.status}:null,finger:f?{active:f.active,blocked:f.blocked,ready:f.ready}:null};}"""
def main():
 os.chdir(ROOT); srv=socketserver.TCPServer(('127.0.0.1',0),Q); threading.Thread(target=srv.serve_forever,daemon=True).start();port=srv.server_address[1]; rows=[]
 try:
  with sync_playwright() as p:
   env=os.environ.copy();env['LIBGL_ALWAYS_SOFTWARE']='1';env['VK_ICD_FILENAMES']='/usr/lib/chromium/vk_swiftshader_icd.json';env['DISPLAY']=''
   b=p.chromium.launch(executable_path='/usr/bin/chromium',headless=True,env=env,args=['--no-sandbox','--disable-dev-shm-usage','--ignore-gpu-blocklist','--enable-webgl','--enable-webgl2','--enable-unsafe-swiftshader','--disable-gpu-sandbox','--ozone-platform=headless','--use-gl=angle','--use-angle=swiftshader-webgl'])
   c=b.new_context(viewport={'width':1200,'height':900})
   for name,case,phase in [('right','v94_right_full','0.75'),('left','v94_left_full','0.25')]:
    pg=c.new_page(); qs=urllib.parse.urlencode({'exercise':'hurdle-stretch','caseId':case,'phase':phase,'play':'0','visualMode':'nex','nativeRuntimeParity':'1','nativeSkin':'1','skinPreset':'freeridehuman','safeBoot':'0','lowPower':'1','maxFPS':'24','build':'V318_ACTUAL_CALF_MESH_AUTHORITY_GATE','v':'V318_'+name}); url=f'http://127.0.0.1:{port}/assets/nexprod/nexprod01-player.html?{qs}'
    try: pg.goto(url,wait_until='domcontentloaded',timeout=10000)
    except: pass
    val=None
    for i in range(18):
     pg.wait_for_timeout(450)
     try: val=pg.evaluate(EVAL)
     except: continue
     if val.get('hasModel') and val.get('mesh'): break
    shot=OUT/f'V318_{name}_canvas.png'
    try: pg.locator('canvas').first.screenshot(path=str(shot),timeout=5000)
    except: pass
    rows.append({'name':name,'value':val,'screenshot':str(shot)});pg.close()
   b.close()
 finally: srv.shutdown();srv.server_close()
 audit={'schema':'NEXT11_V318_BROWSER_ACTUAL_CALF_MESH_AUDIT','generatedAt':time.strftime('%Y-%m-%dT%H:%M:%SZ',time.gmtime()),'rows':rows}
 (OUT/'V318_BROWSER_ACTUAL_CALF_MESH_AUDIT.json').write_text(json.dumps(audit,indent=2));print(json.dumps(audit,indent=2))
if __name__=='__main__':main()
