#!/usr/bin/env python3
"""F4 all-row regeneration and F5 exact discovery-caller captures; writes only scratch."""
import datetime,difflib,hashlib,importlib.util,json,pathlib,re
ROOT=pathlib.Path('/tmp/lead-32913-r1/evidence-capture-3')
PREVIOUS=ROOT.with_name('evidence-capture-2')

def log(message):
 print(datetime.datetime.now(datetime.timezone.utc).isoformat(timespec='milliseconds'),message,flush=True)

def regenerate():
 from normalize_evidence import normalize
 changed=[];normalized_changed=[];count=0
 for row in sorted((ROOT/'rows').iterdir()):
  aggregate=[]
  for item in json.loads((row/'manifest.json').read_text()):
   rel=pathlib.Path(item['path']);folder=ROOT/rel
   for side in ['before','after']:
    target=folder/side/'normalized.txt';text=normalize(folder/side/'transcript.txt')
    if target.read_text()!=text:normalized_changed.append(str(target.relative_to(ROOT)))
    target.write_text(text)
   text=''.join(difflib.unified_diff((folder/'before/normalized.txt').read_text().splitlines(True),(folder/'after/normalized.txt').read_text().splitlines(True),fromfile='before normalized',tofile='after normalized'))
   if text!=(PREVIOUS/rel/'DiffT.diff').read_text():changed.append(str(rel/'DiffT.diff'))
   (folder/'DiffT.diff').write_text(text)
   aggregate.append('\n# '+item['variant']+'\n'+text);count+=1
  if aggregate:(row/'DiffT.diff').write_text(''.join(aggregate))
 rows=[str(row.relative_to(ROOT)/'DiffT.diff') for row in sorted((ROOT/'rows').iterdir()) if (row/'DiffT.diff').read_bytes()!=(PREVIOUS/'rows'/row.name/'DiffT.diff').read_bytes()]
 result={'primary_pairs_regenerated':count,'row_aggregates_checked':73,'normalizer_only_changed_pair_DiffTs':changed,'normalizer_only_changed_row_DiffTs':rows,'changed_normalized_files':normalized_changed,'raw_captures_modified':False}
 (ROOT/'normalizer-change-report.json').write_text(json.dumps(result,indent=2))
 assert count==254
 assert set(x.split('/')[1][:3] for x in changed)=={'P01','P02','P20'}
 log('F4 '+json.dumps(result))

def captures():
 import capture_driver as d
 session=ROOT/('runs-'+d.stamp());session.mkdir()
 case=dict(id='P11',name='status-404-R',surface='P',mech='R',discovery=True,target='latest',seq=[404,200],ps_trace=True)
 pair=d.run_pair(case,session)
 for side in ['before','after']:
  result=pair[side]
  assert result['exit']==1 and not result['timeout']
  assert len(result['requests'])==1 and result['requests'][0]['endpoint']=='latest' and result['requests'][0]['status']==404
  assert 'RESOLVED_VERSION=' not in re.sub(r'DEBUG:[^\n]*','',result['output'])
 d.write(session/'cases.json',json.dumps([case],indent=2))
 d.write(session/'summary.json',json.dumps({'environment':d.ENV_LINE,'results':[pair],'errors':[]},indent=2))
 control=ROOT/'discovery-control';control.mkdir()
 healthy=dict(id='P01',name='healthy-discovery',surface='P',mech='R',discovery=True,target='latest',seq=[200],ps_trace=True)
 p=d.run_pair(healthy,control)
 for side in ['before','after']:
  result=p[side]
  assert result['exit']==0 and not result['timeout'] and len(result['requests'])==1
  assert result['requests'][0]['status']==200 and 'RESOLVED_VERSION=1.2.3' in result['output']
  from normalize_evidence import normalize
  d.write(pathlib.Path(p['folder'])/side/'normalized.txt',normalize(pathlib.Path(p['folder'])/side/'transcript.txt'))
 assert (pathlib.Path(p['folder'])/'DiffT.diff').read_bytes()==b''
 d.write(control/'cases.json',json.dumps([healthy],indent=2))
 d.write(control/'summary.json',json.dumps({'environment':d.ENV_LINE,'results':[p],'errors':[]},indent=2))
 log('F5 actual lookup 404: one latest request, exit 1 at both pins; healthy discovery: one 200, resolved 1.2.3, exit 0 at both pins; control DiffT 0 bytes')

if __name__=='__main__':
 regenerate();captures()
