#!/usr/bin/env python3
import hashlib,json,pathlib,stat
p=pathlib.Path(__file__).resolve().parent
def sha(f):return hashlib.sha256(f.read_bytes()).hexdigest()
files=[]
for f in sorted(p.rglob('*')):
    if f.is_symlink():raise AssertionError('No public/private symlinks')
    if not f.is_file() or f.name=='manifest.json':continue
    if any(k in f.relative_to(p).parts for k in ('cache','runtime','source','__pycache__')):continue
    if f.name.startswith('._'):raise AssertionError('AppleDouble metadata')
    rel=str(f.relative_to(p));private=rel.startswith('private/')
    if private:assert stat.S_IMODE(f.stat().st_mode)==0o600,(rel,oct(stat.S_IMODE(f.stat().st_mode)))
    files.append({'path':rel,'bytes':f.stat().st_size,'sha256':sha(f),'private':private})
for f in (p/'private').rglob('*'):
    if f.is_dir():assert stat.S_IMODE(f.stat().st_mode)==0o700
m={'status':'FOUR_READ_METHODS_PARTIAL_ONLY','public_files':sum(not f['private']for f in files),'private_files':sum(f['private']for f in files),'files':files}
(p/'manifest.json').write_text(json.dumps(m,ensure_ascii=False,indent=2)+'\n')
print(json.dumps({'manifest_sha256':sha(p/'manifest.json'),'public':m['public_files'],'private':m['private_files']}))
