#!/usr/bin/env python3
"""Nonempty post-payment meal reads: MySQL preserved, DM decimal types repaired."""
import hashlib
import json
from pathlib import Path
import integrate_20261010 as tool
from integrate_20261011_batches46_48 import item
from integrate_20261012_batch119 import shape
from integrate_20261012_batch124 import pinned_files
HERE=Path(__file__).resolve().parent
BASE='work_store/apifox/2026-09-30-dm8-interface-acceptance/parallel-prepay-code-scan-20261012/'
REPORT=BASE+'MEAL_READ_ROOT_REVIEW.md'

def verify():
    p=pinned_files();new={}
    for lane in ['B','C']:
        r=json.loads((p/(lane+'-safe-reads-orderfix-receipt.json')).read_text())
        assert r['rows_exact_unchanged'] and r['before_rows']==r['after_rows']
        assert r['source_sha256']['meal_order_service']=='b1c901310e621194643c5e9736c4038624a3977db8daae43564e186aa9fc01fa'
        meta=json.loads((p/(lane+'-meal-decimal-metadata-receipt.json')).read_text())
        cols={c['column_name'].lower():c for c in meta['columns']}
        for name in ['total_price','pay_price','package_fee','discount_amount']:
            c=cols[name];assert c['data_type'].lower()=='decimal' and int(c['data_precision'])==10 and int(c['data_scale'])==2
        assert cols['quota_price']['data_type'].lower() in ['tinyint','smallint']
        new[lane]={}
        for route in ['meal_list','meal_detail']:
            raw=(p/(lane+'-safe-read-orderfix-'+route+'-response.raw')).read_bytes()
            assert hashlib.sha256(raw).hexdigest()==r['results'][route]['body_sha256']
            assert r['results'][route]['http_status']==200 and r['results'][route]['response_status']==200
            body=json.loads(raw);body.pop('trace_id',None);new[lane][route]=body
            if lane=='B':
                before=json.loads((p/('B-safe-read-'+route+'-response.raw')).read_text());before.pop('trace_id',None)
                assert json.dumps(before,ensure_ascii=False)==json.dumps(body,ensure_ascii=False)
            rows=body['data']['list']['data'] if route=='meal_list' else [body['data']['data']]
            assert len(rows)==(2 if route=='meal_list' else 1)
            for row in rows:
                for name in ['total_price','pay_price','package_fee']+(['discount_amount'] if route=='meal_detail' else []):
                    assert type(row[name]) is str
                assert type(row['quota_price']) is int
    for route in ['meal_list','meal_detail']:
        assert shape(new['B'][route])==shape(new['C'][route])
        rows=lambda lane: new[lane][route]['data']['list']['data'] if route=='meal_list' else [new[lane][route]['data']['data']]
        for b,c in zip(rows('B'),rows('C')):
            for field in ['total_price','pay_price','package_fee']+(['discount_amount'] if route=='meal_detail' else []):
                assert b[field]==c[field],field

if __name__=='__main__':
    audit=HERE/'integration-20261012-batch125.json';assert not audit.exists()
    targets=[item('ai_api','GET','/api/MealOrder/'+action,BASE,evidence=REPORT,evidence_only=True) for action in ['list','detail']]
    tool.main(targets,audit,verify)
