#!/usr/bin/env python3
"""Three Store role writes, actual own requests; existing list is regression only."""
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')
BASE = 'work_ai_api/2026-09-30-dm8-interface-acceptance/parallel-store-role-20261012/'


def verify():
    for name, digest in [
        ('run_store_role_crud.php', '10dbe253c81a49b92ab2b2b3c9a4c22deb69c11ca2d59d52cedccaa33b77a665'),
        ('verify_store_role_receipts.php', 'fe85bf23c147add7946a91584a6ae6c2871e73ce9e993fe5685c3af51f73fc53'),
    ]:
        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 / 'verify_store_role_receipts.php')]))
    assert r['status'] == 'verified' and r['business_http_or_db_calls'] == 0
    assert r['list_recursive_key_and_php_json_type_equal']
    for lane in ['B', 'C']:
        assert r['targets'][lane]['checks_passed'] and len(r['targets'][lane]['checks']) == 8
        assert r['targets'][lane]['new_unique_http_keys'] == 3 and r['targets'][lane]['list_regression_only']
    for name in ['store-role-crud-CDXPARSTROLEAC663BDBDD.json', 'C_store_role_crud_CD7F131F0AAE.json']:
        by = {e['phase']: e for e in json.loads((PRIVATE / 'runtime' / name).read_text())['events']}
        assert by['before_setup']['prior_prefix_rows'] == by['before_add']['role_rows'] == 0
        assert by['verify_add']['role_count'] == by['verify_edit']['role_count'] == 1
        assert by['verify_add']['role_row_sha256'] == by['verify_list']['role_row_sha256']
        assert by['verify_edit']['role_row_sha256'] != by['verify_add']['role_row_sha256']
        for action in ['add', 'list', 'edit', 'delete']:
            e = by['after_http_' + action]
            assert e['path'].split('?')[0] == '/store/store.Role/' + action
            assert e['method'] == ('GET' if action == 'list' else 'POST')
            assert json.loads(e['raw_response_exact'])['status'] == 200
        assert by['verify_delete']['role_rows_after'] == by['verify_delete']['relation_rows_after'] == 0


if __name__ == '__main__':
    audit = HERE / 'integration-20261012-batch135.json'
    assert not audit.exists()
    targets = [item('ai_api', 'POST', '/store/store.Role/' + action, BASE,
        from_repo='unreviewed', from_source='apifox-2026-05-08',
        risk='owned-role-and-menu-relation-write-no-user-binding',
        request_type='JSON-form-see-original-private-request',
        readback='tested-pass-own-role0-to1-to1-to0-menu-relations0-to2-to1-to0',
        parity='partial-evidence-original-HTTP-plus-own-source-fields-JSON-types-not-random-ID-equality',
        cleanup='own-role-relations-zero-token-absent-external-zero-no-global-row-invariance-claim')
        for action in ['add', 'edit', 'delete']]
    targets.append(item('ai_api', 'GET', '/store/store.Role/list', BASE, evidence_only=True,
                        risk='owned-role-filtered-list-regression'))
    tool.main(targets, audit, verify)
