import subprocess,json,time,pathlib,sys,os
ROOT=pathlib.Path(os.environ.get('CAPTURE_RUN','/tmp/lead-29420-r1/capture-a6/run-'+time.strftime('%Y%m%dT%H%M%S')+'-'+str(time.time_ns())))
ASSETS=pathlib.Path('/tmp/lead-29420-r1/capture-a6')
CWD='/home/ubuntu/wt/pr-29420'
SESSION='pr29420-a6'
LOG=ROOT/'driver-events.jsonl'
def run(*args):
 t=time.time();p=subprocess.run(['agent-device',*map(str,args),'--session',SESSION],cwd=CWD,text=True,capture_output=True)
 with LOG.open('a')as f:f.write(json.dumps({'session':SESSION,'at':t,'duration':time.time()-t,'args':list(map(str,args)),'code':p.returncode,'stdout':p.stdout,'stderr':p.stderr})+'\n')
 if p.returncode and 'snapshot helper failed' in p.stderr:
  time.sleep(1);p=subprocess.run(['agent-device',*map(str,args),'--session',SESSION],cwd=CWD,text=True,capture_output=True)
 if p.returncode:raise RuntimeError(p.stderr)
 print(p.stdout,flush=True);return p.stdout
def batch(steps,name):
 path=ROOT/(name+'.json');path.write_text(json.dumps(steps));return run('batch','--steps-file',path,'--on-error','stop')
def navigate(side,row):
 run('back')
 subprocess.run(['node',str(ROOT/'navigate.mjs'),str(ROOT/(side+'-fixed-20261102T2038')),row,SESSION],cwd=CWD,check=True)
 run('wait', 'label="'+('First' if row.startswith(('A1','A2','A3','A4','I1')) else 'Ask anything' if row=='M' else 'Commit message')+'"','20000')
 run('wait','stable','500','10000')
KEYS={}
for n in json.load(open(ASSETS/'gboard-tree.json'))['data']['nodes']:
 if n.get('bundleId')=='com.google.android.inputmethod.latin' and n.get('label'):
  r=n['rect'];label=n['label'];KEYS[label.lower()]=(round(r['x']+r['width']/2),round(r['y']+min(r['height']/2,60)))
KEYS[' ']=KEYS['space'];KEYS['\n']=KEYS.get('enter',KEYS.get('done'))
def taptext(text,name):
 steps=[{'command':'snapshot','input':{'interactiveOnly':True}}]
 for c in text.lower():
  x,y=KEYS[c];steps.append({'command':'press','input':{'target':{'kind':'point','x':x,'y':y},'holdMs':1}})
 p=ROOT/(name+'-taps.json');p.write_text(json.dumps(steps,indent=2));return run('batch','--steps-file',p,'--on-error','stop','--json')
def snap(name):
 s=run('snapshot','--json');(ROOT/(name+'-ax.json')).write_text(s);return json.loads(s)['data']['nodes']
def screenshot(name):
 from PIL import Image,ImageChops
 import shutil
 report=[]
 for attempt in range(3):
  a=ROOT/(name+'-settle-'+str(attempt)+'a.png');b=ROOT/(name+'-settle-'+str(attempt)+'b.png')
  run('screenshot',a,'--normalize-status-bar');run('wait','500');run('screenshot',b,'--normalize-status-bar')
  equal=ImageChops.difference(Image.open(a).convert('RGB'),Image.open(b).convert('RGB')).getbbox() is None
  report.append({'attempt':attempt,'pixelIdentical':equal,'gapRequestedMs':500})
  if equal:break
 shutil.copyfile(b,ROOT/(name+'.png'));(ROOT/(name+'-settled.json')).write_text(json.dumps(report,indent=2))
 return report

def record(name):run('record','start',ROOT/(name+'.mp4'),'--fps','15','--hide-touches')
def stop():run('record','stop')
if __name__=='__main__':
 side=sys.argv[1];name=side+'-A1'+os.environ.get('CAPTURE_SUFFIX','')+'-fixed'
 navigate(side,'A1-1');run('press','label="First"','--settle')
 record(name)
 for i in range(1,4):
  navigate(side,'A1-'+str(i));run('press','label="First"','--settle');run('press','label="Or type a custom answer"','--settle');run('wait','500')
  taptext('teh cat sat on teh mat and wnet hoem',name+'-'+str(i));run('wait','700');snap(name+'-'+str(i));screenshot(name+'-'+str(i))
 navigate(side,'M');run('wait','label="Ask anything"');run('press','label="Ask anything"','--settle');run('wait','500');taptext('teh cat sat on teh mat and wnet hoem',name+'-control');run('wait','700');snap(name+'-control');screenshot(name+'-control');stop()
