#!/usr/bin/env python3
"""Prepay code and scan: scoped persisted successes, not payment acceptance."""
import hashlib
import json
from pathlib import Path
import integrate_20261010 as tool
from integrate_20261011_batches46_48 import item

HERE=Path(__file__).resolve().parent
BASE='work_store/apifox/2026-09-30-dm8-interface-acceptance/parallel-prepay-code-scan-20261012/'
REPORT=BASE+'PREPAY_CODE_SCAN_BC_ACTUAL_20261012.md'
PINS={
 'B-code-receipt.json':'e42bc22cdb4885def79a23822501111b501860d58874fbd4c1caaab05addff17',
 'C-code-receipt.json':'7653b9401b20485051b8cfd94e37f382311c0707fade8f0ecf3c79a7a4f8fe47',
 'B-scan-receipt.json':'dfaab29266120236bc743bb5612673882c33f7f9f40b21afa44f981c4be35bb7',
 'C-scan-failed-receipt.json':'86e9714e2c632b577e0980924be8db9b63110a43a3e56fb91c650d794bdb55f0',
 'C-scan-retry-receipt.json':'677b85c2b83692839287f67e4c6baf276999ccb674891e5f6d013785f579eb28'}

def verify():
    data={}
    for name,digest in PINS.items():
        raw=(tool.ROOT/BASE/name).read_bytes();assert hashlib.sha256(raw).hexdigest()==digest
        data[name]=json.loads(raw)
    for lane in ['B','C']:
        r=data[lane+'-code-receipt.json']
        assert r['passed'] and r['http_status']==200 and r['response_code']=='1' and r['source_rows']==1
        for key in ['response_orderid_match','response_torderid_match','response_twocode_match','device_id_match','restaurant_id_match','price_1_cent','waiting_unpaid','raw_input_roundtrip','qrcode_column_match']:assert r[key],key
    assert data['B-code-receipt.json']['response_field_types']==data['C-code-receipt.json']['response_field_types']
    for name in ['B-scan-receipt.json','C-scan-retry-receipt.json']:
        r=data[name];assert r['passed'] and r['http_status']==200 and r['response_status']==200
        assert r['prepay_rows']==r['meal_order_rows']==1 and r['ai_settlement_rows']==0
        for key in ['response_order_id_match','response_is_pay_one','prepay_user_match','prepay_order_no_match','pending_meal_source','wallet_unchanged']:assert r[key],key
    assert data['B-scan-receipt.json']['response_data_types']==data['C-scan-retry-receipt.json']['response_data_types']
    r=data['C-scan-failed-receipt.json'];assert not r['passed'] and r['response_status']==500 and r['meal_order_rows']==r['ai_settlement_rows']==0 and r['wallet_unchanged']

def targets():
    return [item('store','POST','/api/prepayOrder/code',BASE,evidence=REPORT,
        readback='partial-evidence-single-owned-device-one-cent-prepay-raw-input-and-QR-readback',
        success_case='partial-evidence-one-owned-device-prepay-no-payment',
        parity='partial-evidence-all-recorded-response-field-types-and-source-values-not-full-raw-body',
        cleanup='marked-unpaid-fixtures-retained-post-expiry-divergence-separately-open'),
      item('ai_api','POST','/api/PrepayOrder/scan',BASE,evidence=REPORT,
        readback='partial-evidence-one-owned-pending-meal-order-prepay-bind-wallet-unchanged-settlement-zero',
        success_case='partial-evidence-authenticated-scan-to-pending-order-not-payment',
        parity='partial-evidence-response-keys-data-types-own-orderId-isPay-not-full-raw-body',
        cleanup='marked-fixtures-retained-original-C-zero-write-runner-failure-and-later-expiry-divergence-preserved')]

if __name__=='__main__':
    audit=HERE/'integration-20261012-batch110.json'
    assert not audit.exists(),'Preserve original transition'
    tool.main(targets(),audit,verify)
