#!/usr/bin/env python3
"""Six original C routes pair with B222; never credit C API fixture as add HTTP."""
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_batches221_223_224_226 import shape

HERE = Path(__file__).resolve().parent
PRIVATE = Path('/Users/wiscourper/Documents/workspace/zhct/worktrees/dm8-compat-20261012/private-prepay-harness')
BASE = tool.AI + 'parallel-admin-dictionary-20261013/'
STEPS = [('api-edit', 'api-edit-json-v3', '/admin/store.Api/edit'),
    ('menu-add', 'menu-add', '/admin/store.Menu/add'),
    ('menu-edit', 'menu-edit', '/admin/store.Menu/edit'),
    ('menu-set-apis', 'menu-set-apis', '/admin/store.Menu/setApis'),
    ('menu-delete', 'menu-delete', '/admin/store.Menu/delete'),
    ('api-delete', 'api-delete', '/admin/store.Api/delete')]


def verify():
    for directory, report, name, digest, checks in [
        ('batch222-admin-api-menu', 'd4af8495020e776a598f1a7823cd4ff61bf16a64200bd2985ed9079e11557b07',
         'verify_222_offline.php', '343a485270c44e720411a60a0add02de9904fc937f1034a517b693b2ad795353', 46),
        ('batch228-admin-low-id', '83cacb732e1cdd748d7a3a7c1968a65bb20a93a3826a5726f22ed1ddddeeeccf',
         'verify_228_offline.php', '691fc11eab95ae1564dccb2dbda819766e4281c90b52c53a8b8e79788bebb7b2', 68),
    ]:
        root = PRIVATE / directory
        assert hashlib.sha256((root / 'REPORT.md').read_bytes()).hexdigest() == report
        assert hashlib.sha256((root / name).read_bytes()).hexdigest() == digest
        r = json.loads(subprocess.check_output(['/opt/homebrew/opt/php@7.4/bin/php', str(root / name)]))
        assert r['checks'] == checks
    root = PRIVATE / 'batch228-admin-low-id'
    previous = None
    for step, old, path in STEPS:
        r = json.loads((root / f'C-228-{step}-receipt.json').read_text())
        i = json.loads((root / f'C-228-{step}-intent.json').read_text())
        a, b, form = r['before'], r['after'], i['form']
        assert i['before'] == a and r['route'].split('?')[0] == 'POST ' + path
        if previous is not None:
            assert a == previous
        previous = b
        for field, width in [('own_api', 7), ('own_menu', 11), ('own_links', 4)]:
            for row in a[field] + b[field]:
                assert len(row) == width
        if step in ('api-edit', 'menu-edit'):
            field = 'own_api' if step == 'api-edit' else 'own_menu'
            x, y = a[field][0], b[field][0]
            assert shape(x) == shape(y) and set(x) == set(y)
            assert {k for k in x if x[k] != y[k]} <= set(form) | {'update_time'}
            assert all(type(y[k]) is type(v) and y[k] == v for k, v in form.items())
            for other in {'own_api', 'own_menu', 'own_links'} - {field}:
                assert a[other] == b[other]
        elif step == 'menu-add':
            assert a['own_menu'] == [] and len(b['own_menu']) == 1
            row = b['own_menu'][0]
            assert set(row) == set(form) | {'menu_id', 'create_time', 'update_time'}
            assert row['menu_id'] == 10049 and all(type(row[k]) is type(v) and row[k] == v for k, v in form.items())
            assert a['own_api'] == b['own_api'] and a['own_links'] == b['own_links']
        elif step == 'menu-set-apis':
            assert a['own_links'] == [] and len(b['own_links']) == 1
            row = b['own_links'][0]
            assert row['menu_id'] == 10049 and row['api_id'] == 2280 and form == {'apiIds': [2280]}
            assert a['own_api'] == b['own_api'] and a['own_menu'] == b['own_menu']
        elif step == 'menu-delete':
            assert b['own_menu'] == b['own_links'] == [] and a['own_api'] == b['own_api']
        else:
            assert b['own_api'] == b['own_menu'] == b['own_links'] == []
        actual = json.loads((root / f'C-228-{step}.raw').read_bytes())
        baseline = json.loads((PRIVATE / 'batch222-admin-api-menu' / f'B-222-{old}.raw').read_bytes())
        actual.pop('trace_id'); baseline.pop('trace_id')
        assert shape(actual) == shape(baseline) and actual == baseline
        assert type(actual['data']) is list and actual['data'] == []


if __name__ == '__main__':
    audit = HERE / 'integration-20261013-batch228.json'
    assert not audit.exists(), 'Never replay integration main'
    specs = [item('ai_api', 'POST', path, BASE,
        success_case='partial-evidence-original-B222-C228-owned-dictionary-write-fullrow-contracts',
        readback='tested-pass-full7-11-4-input-row-original-transactions-old-four-table-hashes',
        request_type='original-JSON-number-parent-and-menu-fields-see-report') for _, _, path in STEPS]
    specs.append(item('ai_api', 'POST', '/admin/store.Api/add', BASE,
        mysql_state='partial-evidence-original-B222-add-positive',
        dm_state='inconclusive-original-C222-generated-ID-relinked-old-orphans-compensated',
        success_case='partial-evidence-B-only-C228-low-ID-fixture-is-not-original-add',
        mysql_readback='tested-pass-owned-B-API-generated-row', dm_readback='inconclusive-C-old-incoming-ID-collision',
        readback='partial-evidence-B-only-C-original-generated-ID-safety-unresolved',
        parity='not-tested-safe-C-original-API-add'))
    tool.main(specs, audit, verify)
