#!/usr/bin/env python3
"""Frozen owned-user/external-file soft deletes; offline verification only."""
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 = Path('/private/tmp/cdx-ai-hk-course-b.Kmdirn')
BASE = 'work_ai_api/2026-09-30-dm8-interface-acceptance/parallel-owned-user-file-delete-20261012/'


def verify():
    def pin(path, digest):
        assert hashlib.sha256(path.read_bytes()).hexdigest() == digest, path.name
    pin(PRIVATE / 'OWNED_USER_FILE_DELETE_152_MANIFEST_20261012.json',
        'fd632da657f403d016f2e3577e50089e916fd372dae5cb399e9227b05291cf3b')
    pin(PRIVATE / 'OWNED_USER_FILE_DELETE_152_BC_20261012.md',
        'cf370273e9b0f36b5b427de1aaa7e0d46374fd1132f8e595f003945788a4123f')
    m = json.loads((PRIVATE / 'OWNED_USER_FILE_DELETE_152_MANIFEST_20261012.json').read_text())
    records = (m['positive_receipts'] + list(m['final_inventory'].values())
               + m['frozen_setup_tool_failures_not_api_failures'] + list(m['private_tools'].values()))
    for entry in records:
        path = Path(entry.get('local_copy', entry.get('path', '')))
        assert path.is_relative_to(PRIVATE)
        pin(path, entry['sha256'])
    result = json.loads(subprocess.check_output([
        '/opt/homebrew/opt/php@7.4/bin/php', str(PRIVATE / 'verify_delete152_receipts.php')]))
    assert result['status'] == 'verified' and result['real_business_http'] == 8
    assert result['unique_new_keys'] == 4 and all(result['B_C_full_business_body_except_trace_equal'].values())
    bodies = {}
    for entry in m['positive_receipts']:
        doc = json.loads(Path(entry.get('local_copy', entry.get('path', ''))).read_text())
        events = {e['phase']: e for e in doc['events']}
        if 'before_setup' in events:
            source = events['before_setup']['source']
        else:
            # C9716 was prepared by an earlier frozen, pre-HTTP failed runner.
            assert entry['target'] == 'C' and entry['own_file_id'] == 9716
            old = json.loads((PRIVATE / 'runtime/C_owned_file_delete152_cstore_2f0990.json').read_text())
            original = {e['phase']: e for e in old['events']}
            assert original['before_http']['own_file_id'] == 9716
            assert original['before_http']['own_file_full_sha256_before'] == events['before_http']['own_file_full_sha256_before']
            source = original['before_setup']['source']
        for path, digest in source.items():
            assert path.startswith('app/') and '..' not in Path(path).parts
            pin(tool.source_root('ai_api') / path, digest)
        e = events['after_http']
        assert e['method'] + ' ' + e['path'].split('?')[0] == entry['key']
        body = json.loads(e['raw_response_exact'])
        assert type(body['status']) is int and body['status'] == 200
        assert body['data'] == [] and isinstance(body['data'], list)
        del body['trace_id']
        bodies[entry['key'], entry['target']] = body
    for key in {e['key'] for e in m['positive_receipts']}:
        assert bodies[key, 'B'] == bodies[key, 'C']
        assert shape(bodies[key, 'B']) == shape(bodies[key, 'C'])


if __name__ == '__main__':
    audit = HERE / 'integration-20261012-batch152.json'
    assert not audit.exists()
    specs = [item('ai_api', 'POST', '/' + surface + '/' + endpoint + '/delete', BASE,
        risk='owned-zero-asset-user-or-external-virtual-file-soft-delete-no-real-storage',
        readback='tested-pass-owned-full-row-only-is_delete-and-automatic-update_time-changed-zero-references',
        success_case='partial-evidence-single-owned-positive-soft-delete-no-repeat-or-linked-user',
        parity='partial-evidence-full-JSON-values-and-object-array-native-types-except-trace-equal',
        cleanup='synthetic-soft-deleted-rows-retained-C1944-unused-active-fixture-declared-new-workers-stopped-tokens-zero')
        for surface in ['store', 'terminal'] for endpoint in ['User', 'Files']]
    tool.main(specs, audit, verify)
