#!/usr/bin/env python3
"""Upgrade Cater.add only for the fresh, fully persisted W2 scenario."""
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/cater-add-actual159-20261012'
BASE = 'work_store/apifox/2026-09-30-dm8-interface-acceptance/parallel-cater-full-add-20261012/'


def verify():
    for name, digest in [
        ('REPORT.md', '6a37801c86f0b1704e307f38d8007f94a08410146a651d3c6bf69c11e39218cb'),
        ('manifest159.json', '8c8598f66eaad7005c4190017fd9d66018e65944c98dbb01e990cdab1f0551c4'),
        ('verify159.js', 'b6955c0c33196d40cb399f614ca348526da0b50fa0cd9881cc6a826ec7c4e829'),
        ('audit159.json', 'e1e96e0da027961b1f429af446df5ac5b6532dd7b5027f6bee19e077d472d5ec'),
    ]:
        assert hashlib.sha256((PRIVATE / name).read_bytes()).hexdigest() == digest
    result = json.loads(subprocess.check_output(['node', str(PRIVATE / 'verify159.js'), '--readonly']))
    assert result['passed'] and result['checks'] == 1610 and result['assets'] == 86
    assert all(result[key] == 0 for key in ['DB', 'SQL', 'Auth', 'HTTP'])
    for entry in json.loads((PRIVATE / 'source159-current.json').read_text())['files']:
        assert not Path(entry['path']).is_absolute() and '..' 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']:
        r = result['sides'][lane]
        assert r['actual_HTTP'] == 1 and r['complete_physical_columns'] == 238
        assert r['I'] == 9 and r['U_affected'] == 2 and r['D_affected'] == 0
        assert r['outer_begin_commit_pairs'] == 2 and r['savepoint_exec'] == 1
        assert r['HTTP_lastID_parent_calls'] == 16 and r['W1_unchanged'] and r['protected_equal']
        proof = json.loads((PRIVATE / lane / 'proof-CATER159-A.json').read_text())
        body = json.loads(base64.b64decode(proof['body_base64']))
        assert type(body['code']) is int and body['code'] == 0
        assert body['message'] == '菜品添加成功' and set(body['data']) == {'uuid', 'id', 'ai_dishes_id'}
        assert isinstance(body['data']['uuid'], str) and isinstance(body['data']['id'], str)
        assert type(body['data']['ai_dishes_id']) is int and body['data']['ai_dishes_id'] == 0
        assert body['data']['id'] == str(r['Dishes'])
        body['data']['uuid'] = '<generated-own-uuid>'
        body['data']['id'] = '<generated-own-id>'
        bodies.append(body)
    assert bodies[0] == bodies[1] and shape(bodies[0]) == shape(bodies[1])


if __name__ == '__main__':
    audit = HERE / 'integration-20261012-batch159.json'
    assert not audit.exists()
    specs = [item('store', 'POST', '/p/cater/add', BASE,
        risk='fresh-owned-dish-food-component-tags-no-real-AI-device-sync',
        success_case='partial-evidence-one-new-zero-nutrient-full-add-original-two-commits-savepoint',
        readback='tested-pass-full238-physical-column-values-native-types-food-counter1-dish1-component1-tags6',
        parity='partial-evidence-complete-original-HTTP-envelope-types-equal-generated-IDs-mapped',
        boundary_empty_min_max='partial-evidence-all37-zero-nutrients-B-affected0-unchanged84-columns-C-original-no-SQL',
        cleanup='new-W2-rows-retained-W1-and-actors-unchanged-old155-failures-kept-private-workers-retained')]
    tool.main(specs, audit, verify)
