#!/usr/bin/env python3
"""Fail closed on prediction substitution and source-index mistakes."""
from pathlib import Path
import argparse
import json
from timing_data import read_observations
from chopping_model import coefficients, CoefficientGrid


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--input", type=Path, required=True)
    arguments = parser.parse_args()
    rows, selected = read_observations(arguments.input)
    assert {
        name: sum(row["planet"] == name for row in rows)
        for name in ["Kepler-289b", "Kepler-289d", "Kepler-289c"]
    } == {"Kepler-289b": 25, "Kepler-289d": 15, "Kepler-289c": 11}
    assert not any(row["source_num"] == 430 for row in rows)
    assert next(row for row in rows if row["source_num"] == 424)["planet_epoch"] == 29
    grid = CoefficientGrid()
    maximum_error = 0
    for ratio in [1.900037, 1.906341, 1.910049]:
        exact = coefficients(ratio, intervals=1024)
        approximate = grid.at(ratio)
        for first, second in zip(exact, approximate):
            maximum_error = max(
                maximum_error,
                max(abs(a - b) / max(abs(a), 1e-10) for a, b in zip(first, second)),
            )
    assert maximum_error < 1e-5, maximum_error
    print(
        "PASS: 466-row original hash; 51 measured; 25 selected; missing 2021 remains missing; global offsets; Laplace/interpolation max relative error",
        maximum_error,
    )


if __name__ == "__main__":
    main()
