"""Offline fixed-screen reconstruction, with saved-spectrum and refinement checks."""
from pathlib import Path
import argparse,json
import numpy as np
from model import spectrum

def main():
    parser=argparse.ArgumentParser(description=__doc__);parser.add_argument('--out',type=Path,default=Path('synthetic-output'));args=parser.parse_args()
    args.out.mkdir(parents=True,exist_ok=False)
    root=Path(__file__).resolve().parent
    configuration=json.loads((root/'field-input.json').read_text());expected=json.loads((root/'expected-synthetic.json').read_text())
    rows=[]
    for record in expected['records']:
        settings=record['settings'];velocity,depth,flux,column=spectrum(configuration,settings,256,8)
        _,fine_depth,fine_flux,fine_column=spectrum(configuration,settings,512,16)
        error=float(np.max(np.abs(flux-record['transmission'])))
        refinement=float(np.max(np.abs(flux-fine_flux)))
        assert error<2e-6 and refinement<2e-6,(record['id'],error,refinement)
        assert abs(column/record['neutralColumnPerCm2']-1)<1e-7 and abs(column/fine_column-1)<1e-7
        np.savetxt(args.out/(record['id']+'.csv'),np.column_stack([velocity,depth,flux]),delimiter=',',header='velocity_km_per_second,optical_depth,transmission',comments='')
        rows.append(dict(id=record['id'],neutralColumnPerCm2=column,meanTransmission=float(np.mean(flux)),savedSpectrumMaxAbsolute=error,coarseFineMaxAbsolute=refinement))
    assert abs(rows[0]['neutralColumnPerCm2']/rows[1]['neutralColumnPerCm2']-1)<1e-12
    assert abs(rows[0]['neutralColumnPerCm2']/rows[2]['neutralColumnPerCm2']-1)<1e-12
    result=dict(status='PASS_FIXED_SCREEN_RECONSTRUCTION',records=rows,limits='Prescribed finite screen, not hydrodynamics or a fit to the observed forest; mean is over 601 samples from -500 to +500 km/s.')
    (args.out/'summary.json').write_text(json.dumps(result,indent=2)+'\n');print(json.dumps(result))
if __name__=='__main__':main()
