#!/usr/bin/env python3
import json,hashlib,sys,datetime
from pathlib import Path
PROJECT='gacmai_20260718_075153'
def sha(p):return hashlib.sha256(p.read_bytes()).hexdigest()
def main():
 if len(sys.argv)!=6:raise SystemExit('usage: assemble_story.py OUTLINE_SHA BATCH1 BATCH2 BATCH3 OUTPUT')
 outline_sha=sys.argv[1];paths=list(map(Path,sys.argv[2:5]));out=Path(sys.argv[5]);expected=[(1,4),(5,8),(9,12)];parts=[];sources=[]
 for p,rng in zip(paths,expected):
  d=json.loads(p.read_text());assert d['project_id']==PROJECT and d['source_outline_sha256']==outline_sha and d['part_range']==list(rng)
  nums=[x.get('part_number',x.get('part')) for x in d['parts']];assert nums==list(range(rng[0],rng[1]+1)) and all(len(x['paragraphs'])==12 for x in d['parts'])
  parts+=d['parts'];sources.append({'range':list(rng),'path':str(p),'sha256':sha(p)})
 assert [x.get('part_number',x.get('part')) for x in parts]==list(range(1,13))
 story={'schema_version':1,'document_type':'story_candidate','project_id':PROJECT,'source_outline_sha256':outline_sha,'assembled_at':datetime.datetime.now(datetime.timezone.utc).isoformat(),'source_batches':sources,'parts':parts}
 if out.exists():raise SystemExit(f'immutable output exists: {out}')
 out.write_text(json.dumps(story,ensure_ascii=False,indent=2)+'\n');print(json.dumps({'status':'assembled','path':str(out),'sha256':sha(out),'parts':12,'paragraphs':sum(len(x['paragraphs']) for x in parts),'sources':sources},ensure_ascii=False))
if __name__=='__main__':main()
