"""Independent wavelength/pixel quadrature refinement and two deeper grid references."""
import argparse,json,math
from pathlib import Path
from synthetic_optics import pupil_fields,finite_band
from importlib.util import spec_from_file_location,module_from_spec
spec=spec_from_file_location('supported_optics',Path(__file__).with_name('validate-supported-optics.py'))
reference=module_from_spec(spec);spec.loader.exec_module(reference)

def main(output):
    rows=[];settings={'staticOpdNm':40,'evolvingOpdNm':20}
    for separation in (3.,5.,7.):
        source=(separation/math.sqrt(2),separation/math.sqrt(2))
        for wavelength in (1.14,1.34):
            for exposure in (0,4):
                three=finite_band(settings,wavelength,source,exposure,nodes=3)
                five=finite_band(settings,wavelength,source,exposure,nodes=5)
                pixels2=pupil_fields(settings,wavelength,source,exposure,pixel_nodes=2)
                pixels3=pupil_fields(settings,wavelength,source,exposure,pixel_nodes=3)
                rows.append({'separation':separation,'wavelength':wavelength,'exposure':exposure,
                    'band3_vs5':reference.compare(three,five,source),'pixel2x2_vs3x3':reference.compare(pixels2,pixels3,source)})
                print('quadrature',len(rows),flush=True)
    deeper=[]
    for degrees in (0.,45.):
        source=(5*math.cos(math.radians(degrees)),5*math.sin(math.radians(degrees)))
        production=pupil_fields(settings,1.14,source,4,size=512,diameter=64)
        finer=pupil_fields(settings,1.14,source,4,size=1024,diameter=128)
        deepest=pupil_fields(settings,1.14,source,4,size=2048,diameter=256)
        deeper.append({'angle_degrees':degrees,'separation':5,'wavelength':1.14,'exposure':4,
            'production_vs2048_256':reference.compare(production,deepest,source),'reference1024_128_vs2048_256':reference.compare(finer,deepest,source)})
        print('deeper reference',degrees,flush=True)
    result={'scope':'Finite reference comparisons only; no continuum or uniform physical error bound. The hard source/stop edges and pixel integration retain their actual losses.','settings':settings,'cases':rows,'deeper_references':deeper}
    output.write_text(json.dumps(result,indent=2)+'\n')
if __name__=='__main__':
    p=argparse.ArgumentParser(description=__doc__);p.add_argument('--output',type=Path,default=Path('band-pixel-validation.json'));args=p.parse_args();main(args.output)
