"""Invariants and synthetic end-to-end localization checks."""
import json
from pathlib import Path
import numpy as np
from evaluate import scan, physical_pulse, LENS, ALT, GRID
rng=np.random.default_rng(7301)
t=np.arange(0,27,2/(60*24))
f=1+0.0002*rng.normal(size=len(t))
curve={'TIME':t,'PDCSAP_FLUX':f,'QUALITY':np.zeros_like(t)}
grid,clean,_=scan(curve)
signal,p=physical_pulse(t,12.,.6,300.,1.,.3)
_,injected,_=scan(curve,signal)
_,zero,_=scan(curve,np.zeros_like(t))
assert all(np.array_equal(clean[k],zero[k]) for k in clean)
assert np.all(signal>=0)
assert signal.max()<.01
assert 8 < p['duration_hours'] < 12
# Rounded astronomical-unit cross-check predicts about 2540 ppm.
assert 2400 < p['peak_ppm'] < 2700
for k in LENS+ALT:
    assert abs(k.sum())<1e-12
    assert abs(np.dot(k,GRID))<1e-12
    assert abs(np.linalg.norm(k)-1)<1e-12
peak_time=float(grid[np.argmax(injected['baseline'])])
assert abs(peak_time-12)<.15
assert injected['baseline'].max()>clean['baseline'].max()*10
r={'zero_injection_identity':True,'kernel_projection_invariants':True,'positive_physical_pulse':True,'recovered_center_btjd':peak_time,'true_center_btjd':12.,'example_physical_parameters':p}
Path('results').mkdir(exist_ok=True)
Path('results/sanity.json').write_text(json.dumps(r,indent=2))
print(json.dumps(r,indent=2))
