#!/usr/bin/env python3
"""One-time root integration; independently replay immutable terminal evidence."""
import json
from pathlib import Path
import subprocess
import sys
import integrate_20261010 as tool
from integrate_20261011_batches40_42 import manifest, private_files, run, sha
from integrate_20261011_batches46_48 import item, PYTHON

SAFE = tool.STORE + 'parallel-store-card-recommend-identity-read5-20261011/'
RELATED = tool.AI + 'parallel-ai-order-related-read8-20261011/'

def verify_safe():
    m = tool.load(SAFE + 'manifest.json')
    root = Path(m['private_root'])
    assert str(root) == '/private/tmp/cdx-store-safe5.kytvr1'
    private_files(root, {n: {'sha256': s} for n, s in m['private_SHA'].items()})
    for lane in ['B', 'C']:
        private_files(root / lane / 'terminal', json.loads((root / lane / 'terminal/manifest.json').read_text())['files'])
    for original, expected_exit in [(True, 2), (False, 0)]:
        p = subprocess.run([PYTHON, str(root/'compare-readonly.py'), *(['--original'] if original else [])], capture_output=True, text=True)
        assert p.returncode == expected_exit and not p.stderr
        r = json.loads(p.stdout)
        for lane in ['B', 'C']:
            assert len(r[lane]) == 5
            for label, result in r[lane].items():
                red = original and lane == 'C' and label == 'identityLists'
                assert result['passed'] == (not red)
                assert len(result['differences']) == (4 if red else 0)
                assert result['source_unchanged'] and result['DML'] == result['DDL'] == 0
    private_files(root, {n: {'sha256': s} for n, s in m['private_SHA'].items()})
    assert m['HTTP']['total'] == 11 and m['prepared_SQL_count']['total'] == 93
    assert m['DML'] == m['DDL'] == m['new_business_data'] == 0
    assert m['final_all_full_body_values_types_shapes_order_checks_pass']
    assert m['cleanup']['auth_token_request_config_cache_source_archives_and_parent_links_removed']
    assert m['cleanup']['original_B10001_C112175_SSH20770_caffeinate43014_preserved']
    assert sha(tool.ROOT.parent/'zhctproject/store/application/api/service/Identity.php') == m['identity_datetime_root_applied_sha256']

def verify_related():
    m = tool.load(RELATED+'manifest.json')
    manifest(RELATED, m['files'])
    r = json.loads(run(RELATED, sys.executable, 'compare.py'))
    assert r['HTTP'] == 44 and r['positive_original_projections'] == 32 and r['original_C_SQL_reds'] == 4
    assert len(r['complete_BC_positive_pairs']) == 8 and len(r['final_B_unchanged']) == 6
    s = json.loads(run(RELATED, sys.executable, 'sql_audit.py'))
    assert s['B'] == dict(HTTP_business_DML=0, DDL=0, fixture_INSERT=8, fixture_UPDATE=0, SELECT=136, metadata=114, HTTP=22, original_13_table_sets=286)
    assert s['C'] == dict(HTTP_business_DML=0, DDL=0, fixture_INSERT=8, fixture_UPDATE=0, SELECT=104, metadata=276, HTTP=22, original_13_table_sets=286)
    run(RELATED, sys.executable, '-m', 'unittest', 'discover', '-p', 'test_compare.py')
    requests = assertions = failures = 0
    for lane in ['B', 'C']:
        c = tool.load(RELATED+'resource-cleanup-'+lane+'.json')
        assert c['port_closed'] and c['tokens_checked_absent'] == 6 and c['cache_removed'] and c['own_source_removed']
        assert c['credential_collections_and_native_reports_removed'] and c['natural_new_related_table_counts_unchanged'] and c['base_five_tables_unchanged']
        private_files(tool.ROOT/RELATED/'private-evidence'/lane, {n: {'sha256': d} for n, d in c['private_raw_sha256'].items()})
        for relative, digest in c['source_sha256'].items():
            assert sha(tool.ROOT.parent/'zhctproject/ai_api'/relative) == digest, relative
        for native in c['native']:
            requests += native['stats']['requests']['total']
            assertions += native['stats']['assertions']['total']
            failures += native['failures']
    assert (requests, assertions, failures) == (44, 176, 4)
    assert m['fixture_INSERT'] == {'B': 8, 'C': 8} and m['fixture_UPDATE'] == m['HTTP_business_DML'] == m['DDL'] == 0
    manifest(RELATED, m['files'])

def batches():
    safe = []
    for path in ['/api/card/issueStaff', '/p/MenuRecommendSet/lists', '/p/MenuRecommendSet/logList', '/p/MenuRecommendSet/readStaffSet', '/api/identity/lists']:
        r = item('store', 'POST', path, SAFE, from_repo='unreviewed', from_source='apifox-2026-05-08')
        if path.endswith(('logList', 'readStaffSet')):
            r.update(mysql_state='partial-evidence-empty-result-only', dm_state='partial-evidence-empty-result-only',
                success_case='partial-evidence-empty-own-recommendation-source-nonempty-unverified',
                parity='partial-evidence-empty-shape-and-full-source-only')
        safe.append(r)
    related = [item('ai_api', 'GET', f'/{app}/order.{module}/{action}', RELATED,
        boundary_empty_min_max='partial-evidence-own-cancelled-unpaid-zero-order-rejected-exchange-read-only-not-fulfillment')
        for app in ['store', 'terminal'] for module in ['Delivery', 'Refund'] for action in ['list', 'detail']]
    return [(49, safe, verify_safe), (50, related, verify_related)]

if __name__ == '__main__':
    plans = batches()
    for number, _, verify in plans:
        assert not Path(__file__).with_name(f'integration-20261011-batch{number}.json').exists(), 'Preserve original transition audit'
        verify()
    for number, items, verify in plans:
        tool.main(items, Path(__file__).with_name(f'integration-20261011-batch{number}.json'), verify)
