#!/usr/bin/env python3
"""F1/F2 captures at pinned objects, plus independent head/head stability runs."""
import concurrent.futures,json,pathlib
import capture_driver as d

def main():
 import sys
 if "--mixed-H" in sys.argv:
  session=d.ROOT/('runs-'+d.stamp());session.mkdir()
  c=dict(id='P14',name='drop-504-200-H',surface='P',mech='H',progress=True,pty=True,target='archive',seq=['drop']*4+[504,200],ps_trace=True)
  pair=d.run_pair(c,session)
  d.write(session/'cases.json',json.dumps([c],indent=2))
  d.write(session/'summary.json',json.dumps({'environment':d.ENV_LINE,'results':[pair],'errors':[]},indent=2))
  return
 if "--stability-only" in sys.argv:
  stability_only();return
 session=d.ROOT/('runs-'+d.stamp());session.mkdir()
 cases=[dict(id='P11',name='status-404-W',surface='P',mech='W',progress=True,pty=False,target='archive',seq=[404,200],ps_trace=True)]
 for m in ['R','W','H']:
  cases.append(dict(id='P14',name='drop-504-200-'+m,surface='P',mech=m,progress=m=='H',pty=m=='H',target='archive' if m=='H' else 'sums',seq=['drop']*4+[504,200],ps_trace=True))
 d.write(session/'cases.json',json.dumps(cases,indent=2))
 results=[]
 for c in cases:
  results.append(d.run_pair(c,session))
  d.write(session/'summary.json',json.dumps({'environment':d.ENV_LINE,'results':results,'errors':[]},indent=2))
 # Same exact head source, two separately spawned processes/fresh homes per family.
 stability=d.ROOT/('same-revision-'+d.stamp());stability.mkdir()
 checks=[dict(id='S05',name='checksum-504',surface='S',shell='dash',path='F',target='sums',seq=[504,200]),dict(id='P14',name='mixed-W',surface='P',mech='W',pty=False,progress=False,target='sums',seq=['drop']*4+[504,200],ps_trace=True),dict(id='L01',name='checksum-504',surface='L',target='sums',seq=[504,200])]
 pairs=[]
 for c in checks:
  folder=stability/(c['id']+'-'+c['name']);folder.mkdir()
  f=d.Fixture(d.ART)
  try:
   a=d.run_one(c,'after',folder,f)
   # The side is only a directory/manifest label; both use pinned HEAD bytes.
   (folder/'after').rename(folder/'head-a')
   b=d.run_one(c,'after',folder,f)
   (folder/'after').rename(folder/'head-b')
   pairs.append({'case':c,'folder':str(folder),'first':a,'second':b})
  finally:f.close()
  d.write(stability/'summary.json',json.dumps(pairs,indent=2))
 print('FOLLOWUP',session,'STABILITY',stability,flush=True)
def stability_only():
 stability=d.ROOT/('same-revision-'+d.stamp());stability.mkdir()
 checks=[dict(id='S05',name='checksum-504',surface='S',shell='dash',path='F',target='sums',seq=[504,200]),dict(id='P14',name='mixed-W',surface='P',mech='W',pty=False,progress=False,target='sums',seq=['drop']*4+[504,200],ps_trace=True),dict(id='L01',name='checksum-504',surface='L',target='sums',seq=[504,200])]
 pairs=[]
 for c in checks:
  folder=stability/(c['id']+'-'+c['name']);folder.mkdir();f=d.Fixture(d.ART)
  try:
   a=d.run_one(c,'after',folder,f);(folder/'after').rename(folder/'head-a')
   b=d.run_one(c,'after',folder,f);(folder/'after').rename(folder/'head-b')
   pairs.append({'case':c,'folder':str(folder),'first':a,'second':b})
  finally:f.close()
  d.write(stability/'summary.json',json.dumps(pairs,indent=2))
 print('STABILITY',stability,flush=True)
if __name__=='__main__':main()
