"""Rerun canonical physics from a numeric answer; never execute candidate code."""
import argparse
import json
import sys
import time
from pathlib import Path
import numpy as np

def default_reference():
    # Packaged layout (reference/ground_truth.npz) or a flat upload beside score.py.
    here = Path(__file__).parent
    flat = here/'ground_truth.npz'
    return flat if flat.exists() else here/'reference/ground_truth.npz'

def main():
    ap = argparse.ArgumentParser()
    ap.add_argument('--public', type=Path, required=True)
    ap.add_argument('--answer', type=Path, required=True)
    ap.add_argument('--reference', type=Path, default=default_reference())
    ap.add_argument('--out', type=Path, required=True)
    args = ap.parse_args()
    sys.path.insert(0, str(args.public.resolve()))
    from simulate import validate, rollout
    from metrics import evaluate
    start = time.perf_counter()
    try:
        params = validate(json.loads(args.answer.read_text()))
        rollouts = {}
        for primitive in ['dynamic']:
            _, v, f, _ = rollout(params, primitive)
            rollouts[primitive] = (v, f)
    except (ValueError, TypeError, KeyError, json.JSONDecodeError) as exc:
        report = dict(score=0.0, valid=False, reason=str(exc))
    else:
        # Missing/broken evaluator assets are infrastructure errors, not score zero.
        with np.load(args.reference, allow_pickle=False) as obs:
            report = evaluate(rollouts, obs)
        report['valid'] = True
    report['elapsed_seconds'] = time.perf_counter()-start
    args.out.parent.mkdir(parents=True, exist_ok=True)
    args.out.write_text(json.dumps(report, indent=2))
    print(json.dumps({k:v for k,v in report.items() if k != 'metrics'}, indent=2))

if __name__ == '__main__':
    main()
