import json
from pathlib import Path
ROOT=Path(__file__).resolve().parent
SERVICE='app/terminal/service/analysis/Analysis.php'
SHAS={'original':'fff65332f062328dc6a6378a5d575e8947065198a87bfa6f4ccfa23f6ef107ad','candidate_v1':'e0bc2d1b8c76d5014ad335741d5fc6fd8a268db6ac23fddc5c4946e5aee7ef08','candidate_v2':'6eae0679fbb36a8dc76f5287e28257bc991e4db1993c4c638c1f55f8b4b9f0b1'}
def equal(a,b):
    if type(a) is not type(b):return False
    if isinstance(a,dict):return a.keys()==b.keys() and all(equal(a[k],b[k]) for k in a)
    if isinstance(a,list):return len(a)==len(b) and all(equal(x,y) for x,y in zip(a,b))
    return a==b
def verify(e):
    assert len(e['cases'])==16 and e['business_DML']==0 and e['original_rows_unchanged'] and e['tokens_cache_reclaimed']
    assert all(q['tenant_scope_verified'] and q['operation'] not in ['insert','update','delete','replace','merge'] for q in e['sql_audit'])
    assert any(q['business_tables'] for q in e['sql_audit'])
    for phase,expected in SHAS.items():
        b=e['boundary'][phase];assert b['private_cache'] and b['external_forbidden']
        assert all(v['actual_private_path'] for v in b['reflection'].values())
        assert b['reflection'][SERVICE]['sha256']==expected
    totals={'requests':0,'assertions':0,'historical_failed_assertions':0,'current_assertions':0}
    for phase,expected_count in [('original',7),('candidate_v1',7),('candidate_v2',2)]:
        cases=[c for c in e['cases'] if c['phase']==phase];assert len(cases)==expected_count
        for c in cases:
            assert c['http_status']==200
            assert c['actual_contract']['type']=='object' and c['expected_contract']['type']=='object'
            if phase!='original' or e['lane']=='B':
                assert c['complete_original_equal'] and c['native_exit']==0
                assert equal(c['actual_contract'],c['expected_contract'])
        count=assertions=failed=0
        for r in e['native_stats'][phase]:
            st=r['stats'];count+=st['requests']['total'];assertions+=st['assertions']['total'];failed+=st['assertions']['failed']
        assert count==expected_count and assertions==expected_count*4
        assert failed==(5 if phase=='original' and e['lane']=='C' else 0)
        totals['requests']+=count;totals['assertions']+=assertions;totals['historical_failed_assertions']+=failed
        if phase!='original':totals['current_assertions']+=assertions
    assert e['original_type_difference_paths']==(46 if e['lane']=='C' else 0)
    if e['lane']=='B':assert len(e['MySQL_complete_body_invariance'])==7 and all(x['complete_body_unchanged_except_top_trace'] for x in e['MySQL_complete_body_invariance'])
    return totals
def main():
    totals={k:verify(json.loads((ROOT/f'evidence-{k}.json').read_text())) for k in ['B','C']}
    result={'status':'PASS','unique_GET_methods':6,'actual_native_HTTP':sum(t['requests'] for t in totals.values()),'actual_native_assertions_all_phases':sum(t['assertions'] for t in totals.values()),'expected_historical_C_type_failures':5,'candidate_regression_assertions_passed':sum(t['current_assertions'] for t in totals.values()),'natural_business_values_cross_compared':False,'each_lane_complete_original_projection_passed':True,'DML':0,'MySQL_original_seven_complete_bodies_unchanged':True,'limitations':['C dietary_recommend has zero natural rows','scores for synthetic operator are empty','not full error/permission/empty/loading/concurrency coverage'],'candidate_v2_sha256':SHAS['candidate_v2']}
    (ROOT/'comparison.json').write_text(json.dumps(result,ensure_ascii=False,indent=2)+'\n');print(json.dumps(result,ensure_ascii=False))
if __name__=='__main__':main()
