#!/usr/bin/env python3
"""New once-only 0.02 cash payment: complete DTO and original-table readback."""
import hashlib
import json
from pathlib import Path
import stat
import subprocess
import sys
import integrate_20261010 as tool
from integrate_20261011_batch78 import verify as verify_old
from integrate_20261011_batches46_48 import item

BASE=tool.AI+'parallel-ai-direct002-20261011/'
PIN='45a587e9304011fa66ead8c07f1c876e5f86109a64848877ef3fddf65d5537dc'

def verify():
    verify_old()
    root=tool.ROOT/BASE
    assert hashlib.sha256((root/'manifest.json').read_bytes()).hexdigest()==PIN
    manifest=json.loads((root/'manifest.json').read_text())
    groups=[(root,manifest['public_files'])]
    for lane,group in manifest['canonical_private_groups'].items():
        private=Path('/tmp/cdx-ai-core-direct002-20261011')/f'private-{lane}-final'
        assert lane in ['B','C'] and Path(group['root'])==private
        assert not private.is_symlink() and stat.S_IMODE(private.stat().st_mode)==0o700
        groups.append((private,group['files']))
    total=0
    for parent,files in groups:
        for record in files:
            relative=Path(record['path'])
            assert not relative.is_absolute() and '..' not in relative.parts
            path=parent/relative
            assert not path.is_symlink() and path.is_file()
            body=path.read_bytes()
            assert len(body)==record['bytes'] and hashlib.sha256(body).hexdigest()==record['sha256']
            assert oct(stat.S_IMODE(path.stat().st_mode))==record['mode']
            total+=1
    assert total==95
    for name,count in [('oracle.py',5014),('verify_assets.py',13058)]:
        result=subprocess.run([sys.executable,'-B',str(root/name)],capture_output=True,text=True)
        assert result.returncode==0,result.stderr
        report=json.loads(result.stdout)
        assert report['checks']==count
        if name=='oracle.py':
            for lane in ['B','C']:
                assert report['lanes'][lane]['HTTP']==1
                assert report['lanes'][lane]['INSERT']==report['lanes'][lane]['UPDATE']==3
                assert report['lanes'][lane]['full_DTO_data_fields']==16
                assert report['lanes'][lane]['counterexamples']==19
    pins=json.loads((root/'source-frozen-sha.json').read_text())['files']
    assert len(pins)==6168
    for relative,digest in pins.items():
        assert hashlib.sha256((tool.ROOT.parent/'zhctproject/ai_api'/relative).read_bytes()).hexdigest()==digest

def targets():
    return [item('ai_api','POST','/api/mealCheckout/directPay',BASE,
        risk='owned-real-two-cent-cash-payment-3I3U-per-engine-two-independent-transactions',
        success_case='partial-evidence-new-0.02-complete-original-success-16fields-and-full-ledger',
        parity='partial-new-0.02-complete-DTO-type-value-order-and-physical-money-5014-checks-38-counterexamples-original-C0.01-DTO-still-missing',
        duplicate_retry='not-tested-five-second-window-original-case-missed-new-payment-not-replayed',
        boundary_empty_min_max='partial-original-zero-insufficient-and-new-positive-0.02-only-not-all-funding-strategies',
        cleanup='new-one-token-three-cache-files-each-exactly-revoked-own-worker-ports-closed-marked-ledger-retained')]

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