"""Replay only the finite prior inputs needed for the canonical consequence.

The arithmetic module is copied byte-for-byte from the previous completed
round and its hash is checked. This script computes no Selmer or Sha group.
"""
import argparse
import hashlib
import json
import sys
from pathlib import Path

ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT/"provenance"))
from previous_exact_arithmetic import Curve, certificate


def replay():
    hashes = json.loads((ROOT/"provenance/input_hashes.json").read_text())
    actual = hashlib.sha256((ROOT/"provenance/previous_exact_arithmetic.py").read_bytes()).hexdigest()
    if actual != hashes["previous_exact_arithmetic"]["sha256"]:
        raise ArithmeticError("D1_PRIOR_SOURCE_HASH: frozen arithmetic source differs")
    prior = certificate()
    expected = {"b2": 4, "b4": -4, "b6": 1, "b8": -3, "c4": 112,
                "discriminant": 389, "discriminant_is_prime": True}
    if prior["minimal_invariants"] != expected:
        raise ArithmeticError("D2_CURVE_INVARIANTS: minimal invariants differ")
    if prior["minimal_model_point_counts"] != {"2": 5, "5": 9, "11": 16}:
        raise ArithmeticError("D2_CURVE_POINTS: small point counts differ")
    if prior["residual_irreducibility_witness"]["roots_mod_11"]:
        raise ArithmeticError("D2_RESIDUAL_IRREDUCIBILITY: Frobenius polynomial has a root")
    if prior["matrix"] != [[1,2],[1,4]] or prior["determinant_mod_11"] != 2:
        raise ArithmeticError("D3_LOCAL_INDEPENDENCE: local matrix differs")
    for data in prior["local_results"]:
        if data["order_of_multiplied_P"] != 11 or not data["P_orbit_equals_all_points"]:
            raise ArithmeticError(f"D3_LOCAL_INDEPENDENCE: ell={data['ell']}")
    return {"schema": "kurihara-prior-input-replay-v1", "verdict": "PASS",
            "prior_source_sha256": actual,
            "minimal_invariants": prior["minimal_invariants"],
            "small_point_counts": prior["minimal_model_point_counts"],
            "residual_irreducibility_witness": prior["residual_irreducibility_witness"],
            "original_points": {"P": [0,0], "Q": [1,0]},
            "short_model_points": {"P": [12,108], "Q": [48,108]},
            "local_results": prior["local_results"],
            "local_matrix": prior["matrix"], "determinant_mod_11": 2,
            "norm_kernel_dimensions_on_span_PQ": [2,1,1,0],
            "scope": "Exact curve and local-point inputs; canonical primitivity and Kim consequences are theorem applications."}


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("--report", type=Path, default=ROOT/"results/prior_input_replay.json")
    args = parser.parse_args()
    result = replay()
    args.report.parent.mkdir(parents=True, exist_ok=True)
    args.report.write_text(json.dumps(result, ensure_ascii=False, indent=2, sort_keys=True)+"\n",
                           encoding="utf-8")
    print(json.dumps(result, ensure_ascii=False, sort_keys=True))
