#!/usr/bin/env python3
"""Verify preserved original wire, model-local fix and source-derived dynamic leaves."""
from datetime import datetime, timedelta, timezone
import hashlib
import json
from pathlib import Path
import subprocess
import integrate_20261010 as tool
from integrate_20261011_batches46_48 import item

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


def shape(v):
    if isinstance(v, dict):
        return ('object', [(k, shape(v[k])) for k in sorted(v)])
    if isinstance(v, list):
        return ('array', [shape(x) for x in v])
    return type(v).__name__


def verify():
    pinned = {
        'REPORT_202.md': 'c6641adf4cd71f8307d033a4c49cae7e1dee9fb6a36545d02971cf26d2b6e14e',
        'verify202_money_final_offline.php': 'f72e2929648ad0de683c7917281753bf4a0b15931d68fce9ee06a2470a8d587d',
        'B-http-money-final.json': 'ea57827a54bb01c4f9e06e6a83853d2ecf314f5f49cb038465a2573818f5d8c2',
        'C-http-money-final.json': '872c8b108ccaea952d1a8b073f45e5fdf90902fb2b8c0838d5d48b72f17abd25',
    }
    for name, digest in pinned.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 / 'verify202_money_final_offline.php')]))
    assert r['status'] == 'verified-type-parity' and r['final_GET_total'] == 4
    assert r['B_C_deep_type_difference_paths'] == []
    bodies = {}
    for lane in ('B', 'C'):
        setup = json.loads((PRIVATE / f'setup202-{lane}-receipt.json').read_text())
        events = {e['phase']: e['data'] for e in json.loads((PRIVATE / f'{lane}-http-money-final.json').read_text())['events']}
        old_events = {e['phase']: e['data'] for e in json.loads((PRIVATE / f'{lane}-http-green.json').read_text())['events']}
        for label in ('store', 'terminal'):
            source = events['source_after_' + label]['source_after']
            for table in ('user', 'coupon', 'user_coupon'):
                assert shape(source[table]) == shape(setup['own_rows'][table])
                assert source[table] == setup['own_rows'][table]
            body = json.loads(events['http_result_' + label]['raw_response_exact'])
            old = json.loads(old_events['http_result_' + label]['raw_response_exact'])
            body.pop('trace_id'); old.pop('trace_id')
            if lane == 'C':
                old['data']['list']['data'][0]['reduce_price'] = '12.34'
                old['data']['list']['data'][0]['min_price'] = '56.78'
            assert shape(body) == shape(old) and body == old, 'MySQL preserved, DM exactly two leaves changed'
            for view, raw, fields in [
                (body['data']['list']['data'][0], source['user_coupon'][0], ['user_coupon_id', 'coupon_id', 'name', 'user_id']),
                (body['data']['list']['data'][0]['user'], source['user'][0], ['user_id', 'mobile', 'nick_name']),
            ]:
                for field in fields:
                    assert type(view[field]) is type(raw[field]) and view[field] == raw[field]
                for field in ('create_time', 'update_time'):
                    expected = datetime.fromtimestamp(raw[field], timezone(timedelta(hours=8))).strftime('%Y-%m-%d %H:%M:%S')
                    assert view[field] == expected
                for field in fields + ['create_time', 'update_time']:
                    view[field] = '<source-verified>'
            bodies[lane, label] = body
    for label in ('store', 'terminal'):
        assert shape(bodies['B', label]) == shape(bodies['C', label])
        assert bodies['B', label] == bodies['C', label]
    source = tool.source_root('ai_api')
    for filename, digest in {
        'app/common/database/DmBuilder.php': '19a62c2d8d260ff62007a5ef7aad26d3f6debe33906b9d11ceb9899cd95d3079',
        'app/store/model/UserCoupon.php': 'f484f4a113fe60a2d94fab4593f6320b794dc34df4e6aa90fdfd7bc72bb38465',
        'app/terminal/model/UserCoupon.php': 'f353b5b874d1e8adca7ab64491cbbd028a628a7456b03ba11a835f6ab9d48df0',
    }.items():
        assert hashlib.sha256((source / filename).read_bytes()).hexdigest() == digest


if __name__ == '__main__':
    audit = HERE / 'integration-20261013-batch202.json'
    assert not audit.exists(), 'Do not replay matrix integration'
    specs = [item('ai_api', 'GET', '/' + app + '/market.Coupon/receive', BASE,
        success_case='partial-evidence-owned-nonempty-received-coupon-record-list-not-coupon-issuance',
        readback='tested-pass-owned-user-coupon-usercoupon-full-typed-source-unchanged',
        parity='partial-evidence-whole-JSON-types-source-derived-dynamic-leaves-and-two-fixed-decimal-strings',
        cleanup='two-rounds-five-auth-links-each-removed-token-zero-marked-business-three-rows-retained')
        for app in ('store', 'terminal')]
    for spec in specs:
        spec['evidence'] = BASE + 'ROOT_REVIEW.md'
    tool.main(specs, audit, verify)
