#!/usr/bin/env python3
"""Native decisions with a real skater in object slot six and keeper elsewhere.
Reuse the unchanged reset/ABI observers from the individual feature suites.
Only actual role/index/position inputs differ; no outcome or target is forced.
"""
from pathlib import Path
import argparse,json,sys
ap=argparse.ArgumentParser(description=__doc__);ap.add_argument('rom',type=Path);ap.add_argument('output',type=Path);a=ap.parse_args();h=Path(__file__).resolve().parent;a.output.mkdir(parents=True,exist_ok=True)
def probe(name):
 text=(h/('verify_ai_'+name+'.py')).read_text().split('\ncases=[]')[0]
 if name=='gap':
  needle=" for n,t in enumerate(s.get('threats'"
  pos=text.index(needle);text=text[:pos]+" if s.get('sixth_back'):\n  word(own+3,0x34,-1);word(own+5,0,90*sign);word(own+5,0x14,-140*orient);word(own+5,0x34,2)\n"+text[pos:]
 sys.argv=['probe',str(a.rom.resolve()),str(a.output.resolve()),'--baseline',str(a.rom.resolve())];ns={'__file__':str(h/('verify_ai_'+name+'.py'))};exec(compile(text,name+' native reset probe','exec'),ns);return ns['run']
attack=probe('attack');defence=probe('defence');gap=probe('gap');rows=[]
for team in (0,1):
 for direction in (-1,1):
  prefix=f't{team}-d{direction}';blank=[dict(x=140,y=0,role=-1) for _ in range(6)]
  spec=dict(team=team,direction=direction,role=4,px=110,depth=180,receivers=[dict(local=5,x=0,y=220)])
  r=attack(a.rom,prefix+'-sixth-pass',spec,'pass');assert r['x']==5,(spec,r,'sixth real receiver ignored');rows.append(dict(case=prefix+'-pass',observed=r))
  opp=[dict(x=140,y=0,role=-1) for _ in range(5)]+[dict(x=-16,y=208)]
  spec=dict(team=team,direction=direction,role=4,px=110,depth=220,opponents=opp);r=attack(a.rom,prefix+'-sixth-center-mark',spec,'support');assert (r['x'],r['y'])==(-16,180*direction),(spec,r);rows.append(dict(case=prefix+'-center-mark',observed=r))
  role=3 if direction==1 else 5;opp=[dict(x=140,y=0,role=-1) for _ in range(4)]+[dict(x=20,y=246,role=0),dict(x=-44,y=232)]
  spec=dict(team=team,direction=direction,role=role,px=110,depth=220,opponents=opp);r=attack(a.rom,prefix+'-sixth-wing-mark',spec,'support');assert (r['x'],r['y'])==(-28,208*direction),(spec,r);rows.append(dict(case=prefix+'-wing-mark',observed=r))
  opp=[dict(x=140,y=0,role=-1) for _ in range(5)]+[dict(x=20,y=246,role=0)]
  spec=dict(team=team,direction=direction,role=role,px=110,depth=220,opponents=opp,receivers=[dict(local=5,x=-44,y=232)]);r=attack(a.rom,prefix+'-sixth-friendly-spacing',spec,'support');assert (r['x'],r['y'])==(-28,208*direction),(spec,r);rows.append(dict(case=prefix+'-friend-spacing',observed=r))
  threats=[dict(x=140,y=0,role=-1) for _ in range(5)]+[dict(x=-48,y=-210,role=5)]
  spec=dict(team=team,orient=direction,px=110,threats=threats);r=defence('fixed',a.rom,prefix+'-sixth-threat',spec);assert (r['x'],r['y'])==(-36,-222*direction),(spec,r);rows.append(dict(case=prefix+'-defence-threat',observed=r))
  threats=[dict(x=140,y=0,role=-1) for _ in range(5)]+[dict(x=-40,y=-216,role=5)]
  spec=dict(team=team,orient=direction,local=4,threats=threats);r=gap(a.rom,prefix+'-sixth-gap-threat',spec);assert r==[-30,-228*direction],(spec,r);rows.append(dict(case=prefix+'-gap-threat',observed=r))
  spec=dict(team=team,orient=direction,local=4,sixth_back=True);r=gap(a.rom,prefix+'-sixth-nearest-back',spec);assert r==[-30,-228*direction],(spec,r);rows.append(dict(case=prefix+'-nearest-back',observed=r))
(a.output/'results.json').write_text(json.dumps(rows,indent=2)+'\n');print('PASS',len(rows),'native last-object receiver/marking/spacing/threat/nearest-defender cases')
