#!/usr/bin/env python3
"""Three Store-module Staff HTTP actions; Face/MQ downstream remains unverified."""
from decimal import Decimal
import hashlib
import json
import subprocess
from pathlib import Path
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/meal198-store-staff')
BASE = 'work_ai_api/2026-09-30-dm8-interface-acceptance/parallel-store-staff-crud-20261013/'


def verify():
    for name, digest in [
        ('REPORT_198.md', '3d2834b9cde299dc32800332dc5566cbc629b598036b7327afaccf7b035ddb93'),
        ('verify198_offline.php', '2d567457d4a98a34fd495c67233335086e11b1f50fc8797659ef9bb2cb026b06'),
        ('ADDENDUM_SCOPE_198.md', '8a24de5d2ce850b15f23099e755fdf6aab289dbf81773f768de422549e159730'),
        ('B-crud-receipt.json', '74c36461e060fb4cbfa46fb9c0fd0093f1687ab4d771ac787bcb52d7b5caafb6'),
        ('C-crud-receipt.json', '6c56f36ad678706779d8ae4eeaa8ca7fe6670d0a6d3e60f5f6fd540814e9247b'),
    ]:
        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 / 'verify198_offline.php')]))
    assert r['status'] == 'verified' and r['actual_business_HTTP_total'] == 6
    assert r['B_C_wire_equivalent_except_trace_and_own_id']
    for lane in ('B', 'C'):
        s = r['lanes'][lane]
        assert s['real_auth_grants_created'] == s['real_auth_grants_removed'] == 7
        assert s['face_external_boundary_capture'] == 1 and not s['real_face_mq_downstream_covered']
        receipt = json.loads((PRIVATE / f'{lane}-crud-receipt.json').read_text())
        e = {x['phase']: x['data'] for x in receipt['events']}
        for action in ('add', 'edit'):
            form = json.loads(e['http_intent_' + action]['request_body_exact'])['form']
            row = e['after_' + action + '_readback']['own_rows']['staff'][0]
            assert row['name'] == form['name'] and '🧪' in row['name']
            assert int(row['store_id']) == 10001
            for field in ('height', 'weight'):
                assert Decimal(str(row[field])) == Decimal(str(form[field]))
        assert e['after_add_readback']['own_rows']['relation'] == e['after_edit_readback']['own_rows']['relation']
    for file, digest in [
        ('app/store/controller/store/Staff.php', 'b2e2c0db2d915486a12e75d65ffd5408737ca62699dd178f07d7fda757d96681'),
        ('app/store/service/staff/Staff.php', '63748a945e240267cccca92f6df802e1ac6f0f8c84a68d2118f65c2d6f75f93d'),
        ('app/store/model/staff/Staff.php', '01838ead025fe7a20102e01b1e4a59df3b726fa4a902c6db284f852fcd3b37c3'),
    ]:
        assert hashlib.sha256((tool.source_root('ai_api') / file).read_bytes()).hexdigest() == digest


if __name__ == '__main__':
    audit = HERE / 'integration-20261013-batch198.json'
    assert not audit.exists()
    specs = [item('ai_api', 'POST', '/store/store.Staff/' + action, BASE,
        risk='owned-staff-core-write-real-auth-external-Face-and-queue-boundaries',
        success_case='partial-evidence-real-staff-core-CRUD-not-Face-MQ-downstream',
        readback='tested-pass-owned-staff-relation-transitions-fourbyte-decimal-and-seven-auth-cleanup',
        parity='partial-evidence-complete-response-types-values-equal-except-trace-and-own-string-ID',
        cleanup='own-softdeleted-staff-retained-relation-deleted-seven-grants-removed-token-absent')
        for action in ('add', 'edit', 'delete')]
    tool.main(specs, audit, verify)
