"""Package final geometry, source, external shelf and verification evidence."""
from pathlib import Path
import json,hashlib,zipfile
R=Path(__file__).resolve().parent
report=json.loads((R/'runtime_check.json').read_text())
assert report['status']=='PASS', 'Final runtime verification required'
for file,digest in report['inputHashes'].items():
 assert hashlib.sha256((R/file).read_bytes()).hexdigest()==digest,file
files='README.md kit.glb kit.json kit.blend materials.json kit_sheet.png test_house.png test_house.glb test_house_rear.png assembly_clay.png build_kit.py geometry.py details.py prepare_materials.py render_kit.py bind_source_materials.py make_sheet.py validate_kit.py make_delivery.py browser_check.py validation.json audit_glb.json audit_assembly.json assembly_validation.json build_evidence.json runtime_check.json preflight_blender.json preflight_runtime.json preflight_blender.py critic_final.txt critic_revision.txt critic_followup.txt revision_scope.md critic_revision_request.txt critic_followup_request.txt revision_metrics.json sheet.jpg'.split()
paths=[R/p for p in files]
paths += list((R/'materials').rglob('*'))+list((R/'viewer').rglob('*'))
paths += list((R/'renders').glob('*.png'))
paths += list(R.glob('runtime_*.png'))+list(R.glob('details_*.png'))
paths=sorted({p for p in paths if p.is_file() and '__pycache__' not in p.parts})
manifest={str(p.relative_to(R)):hashlib.sha256(p.read_bytes()).hexdigest() for p in paths}
(R/'delivery_checksums.json').write_text(json.dumps(manifest,indent=2)+'\n')
paths.append(R/'delivery_checksums.json')
with zipfile.ZipFile(R/'medieval-town-kit.zip','w',zipfile.ZIP_DEFLATED,compresslevel=6) as z:
 for p in paths:z.write(p,'medieval-town/'+str(p.relative_to(R)))
print('Packaged',len(paths),'files;',round((R/'medieval-town-kit.zip').stat().st_size/1048576,1),'MiB')
