#!/usr/bin/env python3
"""Credits stay until Start: native boot, long wait, wrong buttons, both pads."""
from pathlib import Path
import argparse,json,os,subprocess
ap=argparse.ArgumentParser(description=__doc__);ap.add_argument('rom',type=Path);ap.add_argument('output',type=Path);a=ap.parse_args();out=a.output.resolve();out.mkdir(parents=True,exist_ok=True);here=Path(__file__).resolve().parent;reports=[]
for pad in [1,2]:
 p=out/f'pad{pad}';p.mkdir(exist_ok=True);(p/'commands.txt').write_text('3000 exit\n')
 (p/'hook.py').write_text('''from pathlib import Path
import json
p=Path(outdir);seen=None;pressed=None;left=None;observations=[]
def rw(a):return (wram[ram(a)]<<8)|wram[ram(a+1)]
def test_tick(f):
 global seen,pressed,left
 active=rw(0xd066)==0x4352 and rw(0xb004)==0xc000
 if active and seen is None:seen=f
 if seen is None:
  assert f<1500,'credits card never appeared'
  return
 elapsed=f-seen
 if elapsed in [300,600]:
  assert active,('card auto-advanced',f)
  observations.append(dict(frame=f,event='still waiting'))
 if elapsed in [620,660,700,740]:held[(PAD-1,IDS[['A','B','C','Right'][(elapsed-620)//40]])]=8
 if elapsed==800:
  assert active,'a non-Start button skipped credits'
  observations.append(dict(frame=f,event='wrong buttons ignored'))
  held[(PAD-1,IDS['Start'])]=8;pressed=f
 if pressed and not active and left is None:left=f
 if left and f>=left+240:
  assert left<=pressed+16,('Start ignored',pressed,left)
  (p/'result.json').write_text(json.dumps(dict(pad=PAD,appeared=seen,pressed=pressed,left=left,observations=observations),indent=2)+'\\n')
  print('PASS credits pad',PAD,'waited',pressed-seen,'frames; Start exited');raise SystemExit(0)
 assert f<2900,('credits test timeout',seen,pressed,left)
'''.replace('PAD',str(pad)))
 env={k:v for k,v in os.environ.items() if not k.startswith('GPGX_')};env.update(GPGX_DEV='513',GPGX_AUTO_CREDITS='0',GPGX_HOOK=str(p/'hook.py'))
 with (p/'log.txt').open('w') as log:subprocess.run(['nice','-n','19','python3',str(here/'test_core.py'),str(a.rom.resolve()),str(p/'commands.txt'),str(p)],env=env,stdout=log,stderr=log,check=True,timeout=30)
 reports.append(json.loads((p/'result.json').read_text()))
(out/'results.json').write_text(json.dumps(reports,indent=2)+'\n');print('PASS indefinite credits, non-Start rejection and Start on both pads')
