"""Withheld native JS states against rotated-volume finite differences and ODE ledgers."""
from pathlib import Path
import json
import numpy as np
from scipy.integrate import solve_ivp
from independent_volume import independent_radius, independent_log_derivative
from orbit_reference import integrate_transfer


def verify():
    native = json.loads(Path('native-production-injections.json').read_text())
    assert native['schema'] == 'ac29-native-production-v1'
    errors = []; maximum_radius = maximum_derivative = 0.
    for index, row in enumerate(native['geometry']):
        q = row['massRatio']
        fine = independent_radius(q, 192)
        d_coarse = independent_log_derivative(q, 128, .003)
        d_fine = independent_log_derivative(q, 192, .0015)
        radius_error = abs(row['volumeRadius']/fine-1)
        derivative_error = abs(row['logarithmicResponse']-d_fine)
        assert radius_error < 2e-6 and derivative_error < 2e-7, (q, radius_error, derivative_error)
        assert abs(d_fine-d_coarse) < 2e-7, (q, d_fine-d_coarse)
        maximum_radius = max(maximum_radius, radius_error); maximum_derivative = max(maximum_derivative, derivative_error)
        errors.append({'q': q, 'relative_radius_error': radius_error, 'absolute_response_error': derivative_error,
                       'independent_response_refinement': abs(d_fine-d_coarse), 'native_response_hull': row['numericalResponseHull']})
        if index % 20 == 19: print('PASS', index+1, 'withheld directly computed q states', flush=True)
    orbit_error = angular_error = 0.
    channels = {'constant-specific-j': 'constant-gamma', 'accretor-reemission': 'reemission', 'donor-wind': 'donor-wind'}
    for row in native['balances']:
        p = row['parameters']; a = row['actual']
        expected = integrate_transfer(p['initialMassRatio'], 1, 1, a['removed'], p['retainedFraction'], channels[p['lossChannel']], p['lossAngularMomentumFactor'])
        difference = abs(a['separation']/expected['separation'][-1]-1)
        angular_difference = abs(a['escapedAngular']-expected['escaped_angular'][-1])/a['initialAngular']
        assert difference < 2e-10 and angular_difference < 2e-11, (p, difference, angular_difference)
        orbit_error = max(orbit_error, difference); angular_error = max(angular_error, angular_difference)
    retained = []
    for row in native['failures']:
        q, stellar = row['q'], row['stellarResponse']; removed = q*1e-4
        initial = independent_radius(q, 256); final = independent_radius((q-removed)/(1+removed), 256)
        separation = (q/((q-removed)*(1+removed)))**2
        overfill = (1-removed/q)**stellar*initial/(separation*final)-1
        fitted_response = row['feedback']['fittedLobeResponse']
        exact_response = row['feedback']['exactLobeResponse']
        assert overfill > 0 and exact_response > stellar > fitted_response
        assert row['feedback']['status'] == 'near-threshold'
        retained.append({'q': q, 'stellar_response': stellar, 'independent_finite_overfill_change': overfill,
                         'true_local_response': exact_response, 'fitted_response': fitted_response,
                         'production_classification': row['feedback']['status']})
    streams = []; presets = []
    for row in native['presets']:
        actual = row['actual']
        if actual['scenario'] == 'common-envelope':
            endpoint = actual['endpoint']; assert abs(endpoint['energyResidual']) < 2e-14
            assert not endpoint['predictsGasDynamics'] and not endpoint['predictsMergerProbability']
            presets.append({'name': row['name'], 'event': endpoint['event']}); continue
        q = actual['snapshot']['massRatio']; mu = 1/(1+q); stream = actual['stream']; initial = np.array(stream['states'][0][1:])
        companion_filling = .08/(actual['snapshot']['separation']*independent_radius(1/q, 192))
        assert abs(companion_filling/actual['companionFilling']-1) < 2e-6
        assert actual['companionGeometrySupported'] == (companion_filling < 1)
        def derivative(_, state):
            x,y,vx,vy = state
            r1 = np.hypot(x+mu,y); r2 = np.hypot(x-1+mu,y)
            return [vx,vy,2*vy+x-(1-mu)*(x+mu)/r1**3-mu*(x-1+mu)/r2**3,
                    -2*vx+y-(1-mu)*y/r1**3-mu*y/r2**3]
        solved = solve_ivp(derivative, [0, stream['duration']], initial, method='DOP853', rtol=2e-12, atol=2e-14, dense_output=True)
        assert solved.success
        times = np.array([state[0] for state in stream['states']]); states = np.array([state[1:] for state in stream['states']])
        difference = np.max(abs(solved.sol(times).T-states)); assert difference < 3e-7, (row['name'], difference)
        if stream['ending'] == 'supplied-companion-surface':
            terminal = states[-1]; assert abs(np.hypot(terminal[0]-1+mu, terminal[1])-stream['companionRadius']) < 1e-9
        streams.append({'name': row['name'], 'independent_dop853_maximum_state_error': float(difference),
                        'ending': stream['ending'], 'jacobi_relative_error': stream['maximumJacobiError']})
        presets.append({'name': row['name'], 'adiabatic': actual['adiabatic']['status'], 'thermal': actual['thermal']['status'],
                        'filling': actual['filling'], 'surface_relative_volume_residual': actual['surface']['relativeVolumeResidual']})
    assert native['budgetFeedback']['status'] == 'withheld-work-budget'
    return {'status': 'PASS100withheld direct production q states,150independent ODE ledgers, retained sign flips, budget refusal and actual preset streams',
            'maximum_relative_roche_radius_error': maximum_radius, 'maximum_absolute_roche_response_error': maximum_derivative,
            'maximum_relative_orbital_separation_error': orbit_error, 'maximum_relative_escaped_angular_error': angular_error,
            'withheld_geometry': errors, 'retained_counterexamples': retained, 'preset_streams': streams, 'preset_outcomes': presets,
            'qualification': 'Separate rotated-sphere quadrature and finite differences, actual-JS traces versus adaptive DOP853. Finite floating-point tests, empirical numerical hull and Eggleton-fit deviation do not establish a formal certificate or universal instability threshold. Orbital energy is not closed total energy; frozen stream clock is not stripping time. No gas-dynamic or merger-probability claim.'}


if __name__ == '__main__':
    result = verify()
    output = Path('results/native-production-verification.json')
    output.parent.mkdir(parents=True, exist_ok=True)
    output.write_text(json.dumps(result, indent=2)+'\n')
    print(json.dumps({key:value for key,value in result.items() if key.startswith('maximum') or key=='status'}, indent=2))
