#!/usr/bin/env python3
"""Read only sanitized synthetic reports; fail closed on missing stages/cases."""
import json,pathlib,sys

FROZEN_SQL={
    'decimal30_2':'6001d65fbbe4548cc891b861d7a7d43c3e5a307622c3b2afd31adcce276979ea',
    'decimal20_0':'e24b9181636b0f49e58a6333a5fe6b7f6c7aaa26491249aefdcad16cf955cf94',
    'decimal16_6':'7baf193d709c09db3a33cbd3b8b680c6546345ba698984aa6566222e6a25bf43',
    'decimal38_18':'f480841bb8112b1ddccdc58e2a9f94f404cd07875062c26fb6029826b0c69867',
    'signed':'718d7e25db726a4a5b2dc1ea468b7a94849c0177fe191150d3434b5e7babb69f',
    'unsigned':'6d96b72e721148677910481b01aeee39c3e02ac2a709342ab46f6a5458ae1231',
    'pair':'d8c987b33c2991436c9d1d5e48c92a9d4d5ebb7ba83164659b17fe969ad10062',
    'empty':'078b9081e65b2868aa2ec347dbdbcc7e70384800f469b7b24be9305e5bebef60',
    'mixed':'0863befa43e436b24f637af2bf0e21211f8e64808a2c094e906c1ce9ac882b19',
    'text_pair':'f690728bd88f5ed4fd1d09039b784183e7bff9dfdec4ce0e67a765abf18494fa',
    'reject_wrong_layout':'44369477cc4583258a66bc25c23dea421c22b8a4d5c914857a8633c96dc1a014',
    'reject_nontext_helper':'b972015e9d0929e119961d57e15f6c264e9fdb5bd99b124ede7a8506536a9f14',
    'reject_bad_text':'b264999a0639ca8691a76594e3b23d92c3c1e939e58eeed42359213968a89dd0',
    'reject_null_pair':'e6dfe23eedba3194ddd5d2bcbb8ae288c61b1d5bd477bd6dc244c125e39b1df0',
    'reject_precision':'826b3eb3f55bb82f0e77654503dd95eacca96b475f878e38ca96e5c10a50b524',
    'reject_scale':'d22eb8d09783b31d71675b9ce2234fb72350eb4edab23aef2ec84ed77117d5a0',
    'reject_exponent':'8e71f33fa17206babfadeb4e5fd934b26a893c4d8e3f69476b6f4b0f1e4e800f',
}

def require(value,label):
    if not value: raise AssertionError(label)

def verify(root):
    loaded={name:json.loads((root/(name+'.json')).read_text()) for name in ('core','native','passthrough','recovery')}
    return verify_loaded(loaded)

def verify_loaded(loaded):
    summary={'scope':'synthetic-only','http_pass_increment':0,'global_precision_p0_closed':False,'business_connector_changed':False,'business_reads':0,'dml':0,'ddl':0,'versions':{},'limitations':['real_ORM_getters_not_tested','metadata_keeps_native_numeric_semantics','default_COLUMN_KEY_PAIR_not_supported','STRINGIFY_EMULATE_getters_IM001_unknown']}
    expected_cases={'numeric_%s_%d'%(key,i) for key,count in [('decimal30_2',7),('decimal20_0',6),('decimal16_6',3),('decimal38_18',4),('signed',4),('unsigned',4)] for i in range(count)}
    expected_cases|={'two_rows_all_modes','key_pair_native_key_semantics','empty','mixed_untouched_columns','statement_lifecycle','unsupported_modes_do_not_consume','no_plan_native_passthrough','trusted_plan_rejections'}
    for name,group in loaded.items():
        require(group['stage']==name,'stage name');require([x['php_key'] for x in group['runs']]==['73','74'],'two exact runtimes')
        for run in group['runs']:
            report=run['report'];v=run['php_key'];require(run['exit_code']==0 and run['stderr_bytes']==0,'clean exit')
            require(report['status']=='pass','stage passed')
            summary['versions'].setdefault(v,{})[name]=report['assertions']
            if name=='core':require(report['database_requests']==0 and report['assertions']==76,'pure core count');continue
            require(report['business_reads']==report['dml']==report['ddl']==0,'no business SQL')
            ident=report['identity'];require(ident['int_size']==8 and ident['core_soft']==0 and ident['extra_decimal_defined'] is False,'old safe identity')
            require(len(ident['mapped'])==3 and all(ident['components'][k]==val for k,val in ident['mapped'].items()),'actual mapped hashes')
            require(report['target']['schema_matches'] is True and report['target']['owned_established_loopback_5238_sockets']>=1,'independent target')
            attrs=report['attributes'];require(set(attrs)=={'3','8','11','17','19','20'},'attrs complete')
            for key in ('17','20'):require(attrs[key]['effective']=='unknown' and attrs[key]['sqlstate']=='IM001','unknown not false confirmed')
            for key in ('3','8','11','19'):require(attrs[key]['effective']=='getter-confirmed' and attrs[key]['actual']==attrs[key]['expected'],'known attrs')
            if name!='recovery':
                red=report['native_red'];require(red['original_type']=='double' and red['original_value']==9007199254740992.0 and red['shadow_type']=='string' and red['shadow_value']=='9007199254740993' and red['irreversible_native_mismatch'] is True,'native precision red')
                require(report['assertions']==(16 if name=='native' else 17),'capability assertions')
            else:
                require(report['scope']=='synthetic_fetch_apis_only' and report['real_orm_getter_tested'] is False,'limited scope')
                cases=report['cases'];require(len(cases)==len(expected_cases) and {c['case'] for c in cases}==expected_cases,'complete unique cases')
                require(all(c['status']=='pass' and c['assertions']>0 for c in cases),'case pass')
                require(report['plan_sql_sha256']==FROZEN_SQL,'17 exact frozen SQL plans')
                require(len(report['prepared_sql_sha256'])==44 and set(report['prepared_sql_sha256'])==set(FROZEN_SQL.values()),'actual prepared SQL manifest')
                require(report['execute_calls']==383 and report['assertions']==1380,'frozen matrix volume')
                iterator=report['iterator'];require(iterator['status'] in ('supported_observed','unsupported_bypass'),'iterator observed')
                require(iterator['expected']==[{'k':1,'v':'9007199254740993.01'},{'k':2,'v':None}],'independent iterator expectation')
                require(len(iterator['rows'])==2,'iterator actually consumed two rows')
                require((iterator['rows']==iterator['expected'])==(iterator['status']=='supported_observed'),'iterator not hidden')
                if iterator['status']=='unsupported_bypass':require(iterator['rows']==[{'k':1,'v':9007199254740994.0,'dm_shadow_0':'9007199254740993.01'},{'k':2,'v':None,'dm_shadow_0':None}] and type(iterator['rows'][0]['v']) is float,'exact observed bypass retained')
                summary['versions'][v]['iterator_status']=iterator['status']
                if iterator['status']=='unsupported_bypass' and 'foreach_bypasses_restore_and_blocks_integration' not in summary['limitations']:summary['limitations'].append('foreach_bypasses_restore_and_blocks_integration')
    require(loaded['recovery']['runs'][0]['report']['cases']==loaded['recovery']['runs'][1]['report']['cases'],'two runtime same coverage')
    summary['status']='synthetic_supported_apis_pass_not_integration_ready'
    return summary

if __name__=='__main__':
    try: print(json.dumps(verify(pathlib.Path(sys.argv[1])),ensure_ascii=False,sort_keys=True,indent=2))
    except Exception as e: print(json.dumps({'status':'fail','class':type(e).__name__,'reason':str(e)}));raise SystemExit(1)
