#!/usr/bin/env python3
"""Root-only integration of the bounded Store W2 Role.update/delete pair."""
import hashlib
import json
from pathlib import Path

import integrate_20261010 as tool
from integrate_20261011_batches46_48 import item

PRIVATE = Path('/Users/wiscourper/Documents/workspace/local/dm8-store-role-r2r3-actual-20261011.DWcjR7')
EVIDENCE = 'work_store/apifox/2026-09-30-dm8-interface-acceptance/parallel-store-role-r2r3-20261011/ROOT_REVIEW_ROLE_UPDATE_DELETE_20261011.md'


def verify():
    assert (tool.ROOT / EVIDENCE).is_file()
    manifest_bytes = (PRIVATE / 'manifest.json').read_bytes()
    manifest = json.loads(manifest_bytes)
    assert hashlib.sha256(manifest_bytes).hexdigest() == '033dafc3a8958b5f2ccf4fc50a8afcaab3efce02ff9cc742e13c9acfba82fd60'
    assert manifest['status'] == 'ROLE_R2_R3_OWN_CLOSED_BOUNDED_PASS'
    assert manifest['plan_SHA'] == '7222d748846c6ad520c653bf206ecbd06ffbf97fb4c2badb5e468044a2ccecd9'
    assert manifest['source_map_SHA'] == '579f33e733a7277bcfbca61d7ab458f5ec14b05ec3944c1480792579804fe872'
    assert manifest['HTTP'] == {'B': 2, 'C': 2} and manifest['U'] == {'B': 1, 'C': 1}
    assert manifest['D_attempts'] == {'B': 6, 'C': 6}
    assert manifest['zero_relation_D_per_side'] == 5 and manifest['own_role_D_affected_per_side'] == 1
    assert manifest['original_begin_commit_pairs_per_side'] == 2
    assert manifest['R2_independent_full7_before_R3'] and manifest['final_role_and_links'] == 0
    assert manifest['new_reads'] == {'B': 64, 'C': 87} and manifest['owner_cumulative'] == {'B': 1014, 'C': 1244}
    assert manifest['I'] == manifest['MENU_ADD'] == manifest['F1'] == manifest['DDL'] == manifest['other_HTTP'] == 0
    assert manifest['resources_clean'] and manifest['old_R1_F1_199_assets_unchanged']
    for entry in manifest['files']:
        raw = (PRIVATE / entry['path']).read_bytes()
        assert len(raw) == entry['bytes'] and hashlib.sha256(raw).hexdigest() == entry['sha256']
        assert (PRIVATE / entry['path']).stat().st_mode & 0o777 == 0o600


def targets():
    out = []
    base = EVIDENCE.rsplit('/ROOT_REVIEW', 1)[0] + '/'
    for path, phase in [('/p/role/update', 'update-name-demo-only-before-delete'),
                        ('/p/role/delete', 'delete-exact-own-role-after-independent-update-readback')]:
        out.append(item('store', 'POST', path, base,
            evidence=EVIDENCE,
            from_source='runtime-route-dev-zhct_dev',
            module='角色管理', terminal='PC端', role='existing-authorized-marked-test-actor',
            risk='own-unassigned-role-crud',
            scope='store-primary-existing-W2-role-no-association-only',
            request_type='application/x-www-form-urlencoded',
            success_case='partial-evidence-' + phase + '-one-engine-local-row-source-verified',
            mysql_state='tested-pass', dm_state='tested-pass',
            readback='tested-pass-own-role-fullrow-and-all-three-link-tables',
            parity='partial-evidence-exact-same-wire-and-own-source-deltas-per-lane-no-natural-snapshot-forcing',
            cleanup='R2-own-role-renamed-then-R3-own-role-deleted-no-links-natural-hashes-unchanged-workers-released',
            missing_required='not-tested', invalid_type='not-tested', duplicate_retry='not-tested',
            boundary_empty_min_max='not-tested', performance='not-tested'))
    return out


if __name__ == '__main__':
    audit = Path(__file__).with_name('integration-20261011-batch97.json')
    assert not audit.exists(), 'Preserve any previous integration evidence'
    tool.main(targets(), audit, verify)
