import hashlib
import json
import shutil
from pathlib import Path
from features import Settings

root=Path(__file__).resolve().parent.parent;stage=root/'download';download=root/'delivery'
download.mkdir(exist_ok=False)
shutil.copytree(stage/'validation',download/'validation')
specs=json.loads((root/'specs.json').read_text());manifest={};summaries={}
for key,spec in specs.items():
    source=stage/key;data=download/key/'data';data.mkdir(parents=True)
    for name in ('engine_summary.json','input_contract.json','A_diagnostics.jsonl','B_diagnostics.jsonl','input_rgb_sha256.json'):
        shutil.copy2(source/'data'/name,data/name)
    shutil.copy2(source/'data/technical_audit_v2.json',data/'technical_audit.json')
    for mode in ('A','B'):
        for kind in ('frame_map','video_validation'):
            ext='csv' if kind=='frame_map' else 'json'
            shutil.copy2(source/'data'/(mode+'_'+kind+'_v2.'+ext),data/(mode+'_'+kind+'.'+ext))
        for p in (source/'data').glob(mode+'_v2_sample_*.jpg'):
            shutil.copy2(p,data/p.name.replace('_v2_sample_','_sample_'))
    summary=json.loads((data/'engine_summary.json').read_text())
    audit=json.loads((data/'technical_audit.json').read_text());assert audit['status']=='PASS'
    summaries[key]=summary
    videos={}
    for mode,filename in [('A','A_IDPair_Review.mp4'),('B','B_ROISpatial_Review.mp4')]:
        v=json.loads((data/(mode+'_video_validation.json')).read_text());assert v['status']=='PASS'
        shutil.copy2(source/(Path(filename).stem+'_v2.mp4'),download/key/filename)
        videos[mode]=dict(path=key+'/'+filename,sha256=v['sha256'],frames=v['frames'])
    manifest[key]=dict(source_file=spec['source_file'],source_sha256=spec['sha256'],cache_sha256=summary['cache_sha256'],videos=videos)
(download/'00_README_ko.txt').write_bytes((root/'00_README_ko.txt').read_bytes())
(download/'conditions.json').write_text(json.dumps(dict(algorithm_revision=1,render_revision=2,settings=Settings().payload()),indent=2))
(download/'input_manifest.json').write_text(json.dumps(manifest,ensure_ascii=False,indent=2))
(download/'validation/summary.json').write_text(json.dumps(summaries,indent=2))
(download/'validation/helper_sha256.json').write_text(json.dumps({p.name:hashlib.sha256(p.read_bytes()).hexdigest() for p in sorted((root/'helpers').glob('*.py'))},indent=2))
files={str(p.relative_to(download)):hashlib.sha256(p.read_bytes()).hexdigest() for p in sorted(download.rglob('*')) if p.is_file() and p.name!='SHA256SUMS.json'}
assert len(list(download.glob('*/*_Review.mp4')))==12
(download/'SHA256SUMS.json').write_text(json.dumps(files,ensure_ascii=False,indent=2))
print(json.dumps(dict(videos=12,frames=sum(v['frames'] for x in manifest.values() for v in x['videos'].values()),files=len(files),sha256=hashlib.sha256((download/'SHA256SUMS.json').read_bytes()).hexdigest())))
