#!/usr/bin/env python3
"""Fetch the published frozen Phase 4 model inputs into a NEW directory.
Requires Python 3.10+ and curl. Does not install packages or run models.
"""
import argparse,hashlib,json,pathlib,subprocess
BASE='https://johanstrydom.com'
PREFIX='public/research/parking/v4/'
DESIGN_SHA='3e8711a0fa9938b3965bd3e628473dda6bffcbc0a1c3551cf59e0fac2d7c0c27'
def main():
 p=argparse.ArgumentParser(description=__doc__);p.add_argument('destination');args=p.parse_args();root=pathlib.Path(args.destination).resolve()
 if root.exists() and any(root.iterdir()):p.error('Destination must be new or empty; existing analyses are never overwritten.')
 root.mkdir(parents=True,exist_ok=True)
 def fetch(remote,local,digest=None):
  rel=pathlib.PurePosixPath(local)
  if rel.is_absolute() or '..' in rel.parts:raise ValueError('Unsafe manifest path')
  target=root/rel;target.parent.mkdir(parents=True,exist_ok=True)
  subprocess.run(['curl','--fail','--location','--silent','--show-error','--retry','2',BASE+'/'+remote,'--output',str(target)],check=True)
  if digest and hashlib.sha256(target.read_bytes()).hexdigest()!=digest:raise ValueError('Checksum mismatch: '+local)
  return target
 design=fetch('research/parking/v4/design.json',PREFIX+'design.json',DESIGN_SHA);d=json.loads(design.read_text())
 for f in d['files']:
  path=f['path'];remote=path[len('public/'):] if path.startswith('public/') else 'research/parking/v4/'+pathlib.PurePosixPath(path).name
  fetch(remote,path,f['sha256'])
 control=fetch('research/parking/v4/control-design.json',PREFIX+'control-design.json');c=json.loads(control.read_text())
 if c['designSha256']!=DESIGN_SHA:raise ValueError('Control design does not match the main design')
 fetch('research/parking/v4/parking-phase4-control-tests.py','scripts/parking-phase4-control-tests.py',c['scriptSha256'])
 for name in ['input-manifest.json','analysis.json','control-tests.json','REPRODUCE.txt']:
  fetch('research/parking/v4/'+name,PREFIX+name)
 manifest=json.loads((root/PREFIX/'input-manifest.json').read_text())
 fetch('research/parking/v4/prepare-parking-phase4.py','scripts/prepare-parking-phase4.py',manifest['preparationScriptSha256'])
 print('Downloaded and checked frozen model inputs in',root)
 print('From that directory, with the documented NumPy/SciPy versions installed, run:')
 print('OPENBLAS_NUM_THREADS=1 python scripts/model-parking-phase4.py run')
 print('OPENBLAS_NUM_THREADS=1 python scripts/parking-phase4-control-tests.py run')
if __name__=='__main__':main()
