#!/usr/bin/env python3
"""Root integration of immutable read9 evidence; successor owns live worker."""
import json
from pathlib import Path
import subprocess
import integrate_20261010 as tool
from integrate_20261011_batches40_42 import private_files, sha
from integrate_20261011_batches46_48 import item, PYTHON

BASE = tool.STORE+'parallel-store-category-read9-20261011/'

def verify():
    m = tool.load(BASE+'manifest.json')
    root = Path(m['private_root'])
    assert str(root) == '/private/tmp/cdx-store-category9.rETOWM'
    private_files(root, {n: {'sha256': h} for n, h in m['private_SHA'].items()})
    stable = tool.ROOT/BASE/'private-evidence'
    assert sha(stable/'manifest.json') == m['durable_private_evidence']['manifest_sha256']
    files = json.loads((stable/'manifest.json').read_text())['files']
    assert len(files) == 93
    private_files(stable, {f['path']: f for f in files})
    for lane in ['B', 'C']:
        p = root/lane/'terminal-read9'
        private_files(p, json.loads((p/'manifest.json').read_text())['files'])
        prep = json.loads((p/'private-fixture-insert.json').read_text())
        assert prep['passed'] and prep['all_columns_verified'] and prep['natural_original_unchanged']
        assert prep['INSERT'] == 4 and prep['UPDATE'] == prep['DELETE'] == prep['DDL'] == prep['HTTP'] == 0
    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)
        assert len(r['B']) == len(r['C']) == 9
        assert sum(not v['passed'] for v in r['B'].values()) == 0
        assert sum(not v['passed'] for v in r['C'].values()) == (6 if original else 0)
        assert sum(len(v['differences']) for v in r['C'].values()) == (10 if original else 0)
        assert all(v['nonempty'] and v['source_unchanged'] and v['HTTP_DML'] == v['HTTP_DDL'] == 0 for lane in r.values() for v in lane.values())
    total = queries = 0
    for lane in ['B', 'C']:
        wire = root/lane/('wire-green.jsonl' if lane == 'C' else 'wire.jsonl')
        records = [json.loads(line) for line in wire.read_text().splitlines()]
        assert len(records) == (15 if lane == 'C' else 9)
        for w in records:
            assert w['status'] == 200 and w['path'].lower() in {p.lower() for p in m['paths']}
            assert w['source_before'] == w['source_after']
            for q in w['prepared_SQL']:
                assert q.get('ok') is True and (q['queryString'].lstrip().upper().startswith(('SELECT','SHOW','EXPLAIN')) or q['queryString'] == 'CALL SP_TABLEDEF(?, ?)')
            queries += len(w['prepared_SQL'])
        total += len(records)
    assert (total, queries) == (24, 162)
    for name in ['NutritionCategory', 'MaterialCategory']:
        assert sha(tool.ROOT.parent/'zhctproject/store/application/p/logic'/f'{name}.php') == m['source_SHA'][name+'_root_applied']
    assert m['runtime_handoff']['workers_stopped'] is False
    assert m['runtime_handoff']['cleanup_due_after_successor_slice'] and m['runtime_handoff']['read9_terminal_and_four_fixtures_per_lane_immutable']
    private_files(root, {n: {'sha256': h} for n, h in m['private_SHA'].items()})

def targets():
    m = tool.load(BASE+'manifest.json')
    result = []
    for path in m['paths']:
        r = item('store', 'POST', path, BASE,
            cleanup='owned-read-fixtures-retained-immutable-terminal-archived-workers-auth-explicitly-transferred-to-next-CRUD-slice-not-stopped',
            parity='partial-evidence-complete-own-source-values-types-tree-and-per-engine-native-unordered-query-order-not-cross-snapshot-equality')
        if path in ['/m/nutritionCategory/lists', '/m/nutritionCategory/info']:
            r.update(register_new_runtime_key=True, runtime_observed_method='POST',
                runtime_inventory_scope='controller-direct-http-observed', runtime_direct_http_proof=BASE+'REPORT.md',
                runtime_controller_source='application/m/controller/NutritionCategory.php actual implicit POST; product UI call unverified',
                terminal='direct-controller-HTTP-product-UI-unverified')
        else:
            r.update(from_repo='unreviewed', from_source='apifox-2026-05-08')
        result.append(r)
    return result

if __name__ == '__main__':
    audit = Path(__file__).with_name('integration-20261011-batch51.json')
    assert not audit.exists(), 'Preserve original transition audit'
    tool.main(targets(), audit, verify)
