#!/usr/bin/env python3
"""Two supplement reads; seven concrete dead aliases. Genuine ANY stays open."""
import importlib.util
import json
from pathlib import Path
import sys
import integrate_20261010 as tool
from integrate_20261011_batches40_42 import private_files, run, sha
from integrate_20261011_batches46_48 import item

BASE = tool.STORE + 'parallel-store-finance-lower-read10-20261011/'
MANIFEST = 'b51ad654ab7ae60ccfce52d4c6dd63d053b079893d0d36257b62b04964d0f198'

def verify():
    root = tool.ROOT / BASE
    assert sha(root / 'manifest.json') == MANIFEST
    m = tool.load(BASE + 'manifest.json')
    assert len(m['public']) == 50 and len(m['private']) == 115
    for r in m['public'] + m['private']:
        p = Path(r['path'])
        assert not p.is_absolute() and '..' not in p.parts
        f = root / p
        assert f.is_file() and not f.is_symlink() and f.stat().st_size == r['bytes'] and sha(f) == r['sha256']
    assert all(r['path'].startswith('private/') for r in m['private'])
    private_files(root / 'private', {r['path'][len('private/'):]: r for r in m['private']})
    sys.path.insert(0, str(root))
    try:
        spec = importlib.util.spec_from_file_location('finance_audit', root / 'audit.py')
        module = importlib.util.module_from_spec(spec)
        spec.loader.exec_module(module)
        result = module.verified()  # Do not run audit.py's artifact-writing main.
        assert result['actual_http'] == result['transport_bodies'] == 38
        assert result['prepared_http'] == result['executed_http'] == 170
        assert result['nonDB_unreachable_methods'] == 10
        assert len(result['old_mysql_body_controls']) == 2 and all(x['byte_identical'] for x in result['old_mysql_body_controls'])
    finally:
        sys.path.pop(0)
        sys.modules.pop('verify', None)
    run(BASE, sys.executable, '-m', 'unittest', 'verify.py')
    plan = tool.load(BASE + 'fixture-plan.json')
    pins = tool.load(BASE + 'source-lock-final.json')
    assert len(pins) == 957
    for relative, digest in pins.items():
        assert sha(tool.ROOT.parent / 'zhctproject/store/application' / relative) == digest, relative
    for lane, pk in [('B', 17), ('C', 4)]:
        journal = tool.load(BASE + f'private/{lane}-original/fixture-journal.json')
        assert journal['sql'] == plan['sql'] and journal['values'] == plan['lanes'][lane]
        assert journal['committed'] and journal['insert_sent'] and journal['rowCount'] == 1 and journal['original']['id'] == pk
        cleanup = tool.load(BASE + f'private/{lane}-original/cleanup.json')
        assert cleanup['port_closed'] and cleanup['original_parent_preserved'] and cleanup['database_DML'] == 0
        assert cleanup['retained_database_marker'] == 'CDXFL11E2F7'
        assert all(name in cleanup['removed'] for name in ['source', 'cache', 'runtime', 'private/request.json'])
    for r in m['public'] + m['private']:
        assert sha(root / r['path']) == r['sha256']

def targets():
    out = [item('store', 'POST', '/p/supplementMealOrder/' + action, BASE,
        terminal='PC端', role='original-marked-auth-type0-status-limitation-see-report',
        risk='readonly-zero-supplement-one-prepared-row-no-payment',
        parity='partial-complete-DTO-native-types-and-original-MySQL-two-raw-bodies-byte-identical',
        boundary_empty_min_max='partial-page2-status40-and-missing-positive-ID-original-paginator-contract',
        request_type='application/x-www-form-urlencoded') for action in ['list', 'detail']]
    for group, actions in [('billingRecordLower', ['detail', 'list', 'lists']),
                           ('cashRefundLower', ['detail', 'list']),
                           ('supplementMealOrderLower', ['detail', 'list'])]:
        for action in actions:
            out.append(item('store', 'POST', '/p/' + group + '/' + action, BASE,
                scope='no-db', risk='original-invalid-route-alias-not-DM-SQL-regression',
                mysql_state='tested-fail-shared-original-module-404-POST-no-DB',
                dm_state='tested-fail-shared-original-module-404-POST-no-DB',
                success_case='tested-fail-shared-original-unreachable-route-not-business-DB',
                readback='not-applicable', mysql_readback='not-applicable', dm_readback='not-applicable',
                parity='tested-pass-identical-original-404-envelope-and-native-prepare-execute-zero',
                request_type='application/x-www-form-urlencoded'))
    return out

if __name__ == '__main__':
    audit = Path(__file__).with_name('integration-20261011-batch66.json')
    assert not audit.exists(), 'Preserve original transition audit'
    deferred = []
    for filename, column in [(tool.COVERAGE, 'route_or_command'), (tool.CONTRACT, 'path')]:
        _, rows, _ = tool.read_csv(filename)
        for action in ['detail', 'list', 'lists']:
            path = '/p/billingrecordLowercase/' + action
            found = [r for r in rows if r['repo'] == 'store' and tool.norm(r[column]) == tool.norm(path)]
            assert len(found) == 1 and found[0]['method'] == '*' and found[0]['source'] == 'runtime-route-dev-zhct_dev'
            deferred.append({'file': str(filename.relative_to(tool.ROOT)), 'path': path,
                'original_genuine_ANY_row': dict(found[0]), 'observed_method': 'POST',
                'evidence': BASE + 'REPORT.md',
                'decision': 'POST 404/native0 evidence verified; genuine ANY row/status unchanged because other verbs are not HTTP tested.'})
    tool.main(targets(), audit, verify)
    result = json.loads(audit.read_text())
    result['genuine_ANY_POST_observations_not_collapsed_to_one_method'] = deferred
    result['verified_slice_method_paths'] = 12
    result['status_updated_concrete_method_paths'] = 9
    audit.write_text(json.dumps(result, ensure_ascii=False, indent=2) + '\n')
