#!/usr/bin/env python3
"""Two owned unpaid orders per engine, actual POST and exact original table transitions."""
from decimal import Decimal
import hashlib
import json
from pathlib import Path
import subprocess
import integrate_20261010 as tool
from integrate_20261011_batches46_48 import item
from integrate_20261013_batch202 import shape

HERE = Path(__file__).resolve().parent
PRIVATE = Path('/private/tmp/cdx-ai-hk-course-b.Kmdirn/meal209-owned-order-events')
BASE = 'work_ai_api/2026-09-30-dm8-interface-acceptance/parallel-order-events-20261013/'


def verify():
    for name, digest in {
        'REPORT_209.md': 'b1b508fd796f9a754c90b626a95d648742d31eafdcba26465618d629b1d1e96e',
        'verify209_offline.php': '87271fa61a176aafaeb73cd853ec0a69d9cb72ccc9f48c663b5f8745f9ef86d3',
        'B-business-receipt.json': '6de7d91c8ec0c52e68be17e77d1673882f7eb29d280c58d40749f523df96a042',
        'C-business-receipt.json': '561e2cdf6d9a8bed672f025238594e4eee09966ddcdaa1942e55ddbfb106cfcf',
    }.items():
        assert hashlib.sha256((PRIVATE / name).read_bytes()).hexdigest() == digest
    r = json.loads(subprocess.check_output(['/opt/homebrew/opt/php@7.4/bin/php', str(PRIVATE / 'verify209_offline.php')]))
    assert r['status'] == 'verified' and r['original_POST_total'] == 14
    bodies = {}
    for lane in ('B', 'C'):
        record = json.loads((PRIVATE / f'{lane}-business-receipt.json').read_text())
        events = {e['phase']: e['data'] for e in record['events']}
        for label in ('store_zero_reject', 'store_price', 'store_remark', 'store_delete', 'terminal_price', 'terminal_remark', 'terminal_delete'):
            body = json.loads(events['http_result_' + label]['raw_response_exact'])
            assert isinstance(body['data'], list) and body['data'] == []
            assert type(body['status']) is int
            body.pop('trace_id'); bodies[lane, label] = body
        original = record['source_before']
        for label in ('store_price', 'store_remark', 'store_delete', 'terminal_price', 'terminal_remark', 'terminal_delete'):
            after = events['source_after_' + label]['source_after']
            for key in ('store_order', 'terminal_order'):
                assert len(after[key]) == 1 and len(after[key][0]) == 37
                assert set(after[key][0]) == set(original[key][0])
            key = 'store_order' if label.startswith('store_') else 'terminal_order'
            row = after[key][0]
            if label.endswith('_price'):
                form = json.loads(events['http_intent_' + label]['request_body_exact'])['form']
                order_price, express = Decimal(str(form['order_price'])), Decimal(str(form['express_price']))
                assert Decimal(str(row['order_price'])) == order_price == Decimal('0.01')
                assert Decimal(str(row['express_price'])) == express == Decimal('0.00')
                assert Decimal(str(row['pay_price'])) == order_price + express
                assert Decimal(str(row['update_price'])) == order_price - Decimal(str(original[key][0]['order_price']))
    for label in [k[1] for k in bodies if k[0] == 'B']:
        assert shape(bodies['B', label]) == shape(bodies['C', label])
        assert bodies['B', label] == bodies['C', label]


if __name__ == '__main__':
    audit = HERE / 'integration-20261013-batch209.json'
    assert not audit.exists(), 'Do not replay matrix integration'
    specs = []
    for app in ('store', 'terminal'):
        for action in ('updatePrice', 'updateRemark', 'delete'):
            extra = {'boundary_empty_min_max': 'partial-evidence-original-zero-total-rejected-full-row-unchanged'} if app == 'store' and action == 'updatePrice' else {}
            specs.append(item('ai_api', 'POST', f'/{app}/order.Event/{action}', BASE,
                success_case='partial-evidence-owned-unpaid-order-price-remark-softdelete-not-payment-or-refund',
                readback='tested-pass-full37-columns-exact-input-money-remark-target-and-other-order-unchanged',
                parity='partial-evidence-complete-original-JSON-keys-values-types-equal-except-trace',
                cleanup='own-softdeleted-two-orders-retained-seven-auth-links-removed-user-operator-API-unchanged-token-zero', **extra))
    tool.main(specs, audit, verify)
