import hashlib,json,pathlib,platform,shutil,subprocess,time
import numpy,scipy
source=pathlib.Path('/bundle'); dest=pathlib.Path('/tmp/reproduction')
shutil.copytree(source,dest)
shutil.rmtree(dest/'results')
t=time.monotonic()
r=subprocess.run(['sh','code/run'],cwd=dest,text=True,capture_output=True,timeout=300)
print(json.dumps({'python':platform.python_version(),'numpy':numpy.__version__,'scipy':scipy.__version__,'exit_code':r.returncode,'elapsed_seconds':round(time.monotonic()-t,3),'stdout':r.stdout,'stderr':r.stderr}))
if r.returncode: raise SystemExit(r.returncode)
comparisons=[]
for p in sorted((source/'results').rglob('*')):
 if p.is_file():
  rel=p.relative_to(source); generated=dest/rel
  comparisons.append({'file':str(rel),'identical':generated.is_file() and generated.read_bytes()==p.read_bytes(),'sha256':hashlib.sha256(generated.read_bytes()).hexdigest() if generated.is_file() else None})
print(json.dumps({'result_files':comparisons},indent=2))
assert all(x['identical'] for x in comparisons)
claims=json.loads((source/'claims.json').read_text());checked=[]
for claim in claims:
 count=0
 for evidence in claim['evidence']:
  if 'result' not in evidence: continue
  parts=evidence['result'].split('.'); original=json.loads((source/'results'/(parts[0]+'.json')).read_text()); actual=json.loads((dest/'results'/(parts[0]+'.json')).read_text())
  for part in parts[1:]: original=original[part];actual=actual[part]
  assert actual==original,(claim['local_id'],evidence['result'])
  count+=1
 checked.append({'claim':claim['local_id'],'evidence_fields_matched':count})
print(json.dumps({'claims':checked},indent=2))
