#!/usr/bin/env python3
"""Cater status/delete succeed; interrupted add must remain limited evidence."""
import base64
import hashlib
import json
import subprocess
from pathlib import Path
import integrate_20261010 as tool
from integrate_20261011_batches46_48 import item
from integrate_20261012_batch148 import shape

HERE = Path(__file__).resolve().parent
PRIVATE = tool.ROOT.parent.parent / 'local/dm8-store-purchase-read3-20261012.L5dTYR/stage3/cater3-actual155-20261012'
BASE = 'work_store/apifox/2026-09-30-dm8-interface-acceptance/parallel-cater-status-delete-20261012/'


def verify():
    for name, digest in [
        ('REPORT.md', 'aae00aecd8a5fb256ceb8e0171448f1b7ffbd052a147ff0dd86156b598cb9e53'),
        ('manifest.json', '8a8dd3f8afa1de6f866837aa765453fecba0e9cef948b9a049003d80abe2564d'),
        ('verify.js', '42e044336d20829f3f1527270a4f47aff37087f1253acfe5cba5c9f9366ebf64'),
        ('audit.json', 'b1e09db425bcf4963abd522179578402a6809dab297d6e688464968e7a844108'),
    ]:
        assert hashlib.sha256((PRIVATE / name).read_bytes()).hexdigest() == digest
    r = json.loads(subprocess.check_output(['node', str(PRIVATE / 'verify.js'), '--readonly']))
    assert r['passed'] and r['checks'] == 1295 and r['assets'] == 139
    assert all(r[k] == 0 for k in ['DB', 'SQL', 'Auth', 'HTTP'])
    source = json.loads((PRIVATE / 'cater155-source.json').read_text())
    for entry in source['files']:
        assert '..' not in Path(entry['path']).parts
        assert hashlib.sha256((tool.source_root('store') / entry['path']).read_bytes()).hexdigest() == entry['sha256']
    bodies = {}
    for lane in ['B', 'C']:
        assert not r['sides'][lane]['Add_API_success']
        assert r['sides'][lane]['actual_HTTP'] == 4 and r['sides'][lane]['selected_success'] == 2
        assert r['sides'][lane]['parent_INSERT'] == 4 and r['sides'][lane]['savepoint_exec'] == 1
        for step in ['S', 'D']:
            doc = json.loads((PRIVATE / lane / ('proof-CATER155-' + step + '.json')).read_text())
            body = json.loads(base64.b64decode(doc['body_base64']))
            assert body == {'code': 0, 'message': '菜品修改成功' if step == 'S' else '菜品删除成功', 'data': []}
            assert type(body['code']) is int and isinstance(body['data'], list)
            bodies[lane, step] = body
    for step in ['S', 'D']:
        assert shape(bodies['B', step]) == shape(bodies['C', step])


if __name__ == '__main__':
    audit = HERE / 'integration-20261012-batch155.json'
    assert not audit.exists()
    specs = [item('store', 'POST', '/p/cater/' + action, BASE,
        risk='own-incomplete-created-dish-status-and-soft-delete-no-real-AI-device',
        readback='tested-pass-full-owned-food-dish-component-rowsets-and-counter1-to0',
        success_case='partial-evidence-single-owned-status-and-soft-delete-tags0-no-complete-add',
        cleanup='own-food-counter0-soft-deleted-dish-component-tags0-retained-original-actors-workers-retained')
        for action in ['change', 'del']]
    specs.append(item('store', 'POST', '/p/cater/add', BASE,
        mysql_state='partial-evidence-tool-interrupted-no-valid-API-envelope',
        dm_state='partial-evidence-tool-interrupted-no-valid-API-envelope',
        mysql_readback='partial-evidence-parent-main-commit-only-unfinished-nutrition-tags',
        dm_readback='partial-evidence-parent-main-commit-only-unfinished-nutrition-tags',
        success_case='partial-evidence-Add-not-successful-two-tool-interruptions-per-engine',
        parity='partial-evidence-empty-response-not-a-success-contract',
        readback='partial-evidence-committed-main-rows-only-later-own-soft-delete',
        cleanup='no-add-replay-no-manual-nutrition-tags-backfill-old-errors-and-parent-I-U-retained'))
    tool.main(specs, audit, verify)
