#!/usr/bin/env python3
from pathlib import Path
import hashlib,json,subprocess,datetime,sys
P='gacmai_20260717_104203';EXPECTED='e34de32ac157ac5e3a80dad320e404ec8e6d60eaf5329bb05d340b1f66ca3d12'
R=Path('/data/video-pipeline/GacMaiAudio/project')/P;A=R/'artifacts';S=A/'scripts';O=A/'locked_outline_canonical.json'
def sha(p):return hashlib.sha256(p.read_bytes()).hexdigest()
def run(args):
 cp=subprocess.run(args,text=True,capture_output=True)
 if cp.returncode:raise SystemExit(cp.stdout+cp.stderr)
 return json.loads(cp.stdout)
if len(sys.argv)!=4:raise SystemExit('usage: finalizer SNAP1 SNAP2 SNAP3')
if sha(O)!=EXPECTED:raise SystemExit('outline checksum mismatch')
snaps=[Path(x) for x in sys.argv[1:]]
for p in snaps:
 if not p.exists() or A/'completion_snapshots' not in p.parents:raise SystemExit(f'invalid snapshot {p}')
vals=[run(['python3',str(S/'validate_batch.py'),str(p)]) for p in snaps]
if [x['part_range'] for x in vals]!=[[1,4],[5,8],[9,12]]:raise SystemExit('snapshot ranges mismatch')
if sha(snaps[1])!='b1ebc1857507ce54a960ca4fa56a7834da5f565aa8ef96b05e0359f1454b1bcb':raise SystemExit('approved P5-P8 editorial rev1 checksum mismatch')
story=A/'story_package_candidate.json';assembly=run(['python3',str(S/'assemble_story.py'),str(O),*[str(x) for x in snaps],str(story)])
validation=run(['python3',str(S/'validate_story.py'),str(story),str(O)])
dup=run(['python3',str(S/'audit_duplicates.py'),str(story)])
ev=run(['python3',str(S/'audit_evidence_authority.py'),str(story),str(O)])
h=sha(story)
for name,d in [('story_validation.json',validation),('duplication_audit.json',dup),('evidence_authority_audit.json',ev)]:
 if d.get('story_sha256') not in (None,h):raise SystemExit(f'{name} story SHA mismatch')
 d['story_sha256']=h;(A/name).write_text(json.dumps(d,ensure_ascii=False,indent=2)+'\n')
receipt={'status':'passed','project_id':P,'outline_sha256':EXPECTED,'story_path':str(story),'story_sha256':h,'source_snapshots':[{'path':str(x),'sha256':sha(x)} for x in snaps],'batch_validation':vals,'assembly':assembly,'validation':validation,'duplication':dup,'evidence_authority':ev,'created_at':datetime.datetime.now(datetime.timezone.utc).isoformat()};(A/'deterministic_story_receipt.json').write_text(json.dumps(receipt,ensure_ascii=False,indent=2)+'\n');print(json.dumps(receipt,ensure_ascii=False))
