from preflight import R,g
from pathlib import Path
import csv,json
plan=json.loads((R/'plan.json').read_text());trial=json.loads((R/'shared-trial.json').read_text());api=json.loads((R/'source-verify.json').read_text())
assert trial['stage']=='PASS' and trial['remaining']==[] and api['tests']==2 and api['errors']==api['failures']==0
assert not (R/'build-started.json').exists() and not (R/'once-trial.json').exists()
files={str(g.ENV):plan['env_hash'],plan['active']:plan['active_hash'],plan['overlay']:plan['overlay_hash'],plan['registry']:plan['registry_hash'],**plan['model_hashes']}
assert all(g.sha(Path(p))==h for p,h in files.items())
before,after=trial['no_external_before'],trial['no_external_after']
results={}
for label in ('a','b'):
    value=json.loads((R/('rx-'+label+'.json')).read_text());rows=value['frames'];deltas=[(b['rtp']-a['rtp'])%(1<<32) for a,b in zip(rows,rows[1:])]
    results[label]=dict(frames=len(rows),packets=value['packets'],sdp=value['sdp'],sender_reports=len(value['sender_reports']),
                        rtp_deltas=sorted(set(deltas)),elapsed=value['elapsed'],error_count=len(value['errors']))
summary=dict(source_tests=2,previous_tests_reused=24,shared=dict(status='PASS',same_frame_packet_groups=trial['same_frame_packets'],
  clock_rate=trial['clock_rate'],sr_anchor_error_ms=trial['sr_error_ms'],receivers=results,
  no_external_before=[v['media']['packets'] for v in before],no_external_after=[v['media']['packets'] for v in after],
  late_join_seconds=3,receiver_network='bridge',cleanup='owned sender0 and receiver helper commands completed'),
  limits=dict(decoded_frame_match='NOT_TESTED; compressed RTP group digest equality',windows_web='NOT_TESTED',
              absolute_capture_time='NOT_TESTED; synthetic playback',cpu_ram_usage='NOT_SAMPLED; caps applied',
              once_eof='NOT_RUN; approval rejected before execution',image='NOT_BUILT; approval rejected before execution'),
  final=dict(operating_mutations=0,env_config_registry_model_hashes_unchanged=True,sample01_reflected=False,
             sample01_ready_for_swagger=False,default_sender='not modified; preflight no running sender',
             approval_capacity_failures=2),next=['once natural EOF','cached exact image build and image-owned tests','Analytics reflect with all streams stopped','approved sample01 LAN start'])
(R/'summary.json').write_text(json.dumps(summary,indent=2))
with (R/'summary.csv').open('w',newline='') as f:
    w=csv.writer(f);w.writerow(['boundary','result','value','limit'])
    w.writerow(['API source','PASS',2,'image not reflected'])
    w.writerow(['same RTP frame group','PASS',trial['same_frame_packets'],'no decoded pixel comparison'])
    w.writerow(['SR Anchor max error ms','PASS',max(trial['sr_error_ms']),'playback only'])
    for label,value in results.items():w.writerow(['receiver '+label,'PASS',value['frames'],'RTP timestamp groups'])
    w.writerow(['once/image','NOT_RUN',0,'auto-review capacity error before execution'])
ledger=json.loads((R/'ledger.json').read_text());ledger.update(source_api_tests='PASS2',shared_trial='PASS',
  once_trials=0,builds=[],reflection=0,approval_failures=2,approval_error='Selected model is at capacity',
  temporary_sender_cleanup='PASS',next=summary['next']);(R/'ledger.json').write_text(json.dumps(ledger,indent=2))
print(json.dumps(summary,indent=2))
