"""Separate polar chart verifies native shear/envelope flux, velocity and active proxy."""
from pathlib import Path
import json
import numpy as np
from rotation_reference import disk_quadrature
rows = json.loads(Path('surface-injections.json').read_text())
x,y,z,weight = disk_quadrature(192, 960)
maximum = np.zeros(4)
for row in rows:
    settings = row['settings']; time = row['time']
    inc = np.deg2rad(settings['spinInclinationDegrees']); lat = np.deg2rad(settings['spotLatitudeDegrees'])
    phase = np.deg2rad(settings['spotLongitudeDegrees']) + 2*np.pi*time/settings['rotationDays']*(1-settings['differentialRotationShear']*np.sin(lat)**2)
    direction = [np.cos(lat)*np.sin(phase), np.sin(lat)*np.sin(inc)-np.cos(lat)*np.cos(phase)*np.cos(inc), -np.sin(lat)*np.cos(inc)-np.cos(lat)*np.cos(phase)*np.sin(inc)]
    amp = np.exp(-.5*((time-settings['spotEvolutionPeakDay'])/settings['spotEvolutionSigmaDays'])**2)
    region = amp*np.exp(-(1-x*direction[0]-y*direction[1]-z*direction[2])/np.deg2rad(settings['spotWidthDegrees'])**2)
    cell_weight = weight*(1-settings['spotContrast']*region)
    velocity = 2*np.pi*695700000/(settings['rotationDays']*86400)*np.sin(inc)*x*(1-settings['differentialRotationShear']*(y*np.sin(inc)-z*np.cos(inc))**2) + settings['convectiveSuppressionMps']*region
    centroid = np.sum(cell_weight*velocity)/np.sum(cell_weight)
    variance = np.sum(cell_weight*(velocity-centroid)**2)/np.sum(cell_weight)
    values = [np.sum(cell_weight)/np.sum(weight),centroid,variance,np.sum(weight*region)/np.sum(weight)]
    native = [row['flux'], row['centroidMps'],row['variance'],row['active']]
    error = np.abs(np.array(values)-native)
    error[2] /= max(1, variance)
    maximum = np.maximum(maximum,error)
assert maximum[0]<1e-6 and maximum[1]<.001 and maximum[2]<1e-6 and maximum[3]<1e-6,maximum
report = {'status':'PASS108 independently integrated shear/envelope cases including zero/polar/extreme latitude, signed contrast and narrow regions',
          'maximum_absolute_flux_centroid_relative_variance_active_error':maximum.tolist(),
          'same_authority':'surfacePhaseAdvance drives spot centre/meridians/drag; activeRegionAmplitude drives continuum/convection/active proxy/rendered intensity',
          'qualification':'Finite ordinary floating-point probes, not a formal continuum certificate; spectrum/profile implementation itself is unchanged'}
Path('results/hook-verification-results.json').write_text(json.dumps(report,indent=2)+'\n')
print(json.dumps(report,indent=2))
