#!/usr/bin/env python3
"""Food native CRUD is measured; physical date and auto-update failures stay open."""
import hashlib
import json
from pathlib import Path
import stat
import subprocess
import sys
import integrate_20261010 as tool
from integrate_20261011_batches46_48 import item

BASE = tool.STORE + 'parallel-store-food-crud3-20261011/'

def verify():
    private = tool.ROOT / BASE / 'private'
    manifest = private / 'food-main-manifest.json'
    assert hashlib.sha256(manifest.read_bytes()).hexdigest() == 'a0153a6e5181b6c5542c54f0bf86e35f920cffc940e8899ab1918768b1e9fde6'
    records = json.loads(manifest.read_text())['files']
    assert len(records) == 173 and stat.S_IMODE(private.stat().st_mode) == 0o700
    for record in records:
        relative = Path(record['path'])
        assert not relative.is_absolute() and '..' not in relative.parts
        path = private / relative
        assert path.is_file() and not path.is_symlink()
        raw = path.read_bytes()
        assert len(raw) == record['bytes'] and hashlib.sha256(raw).hexdigest() == record['sha256']
        assert oct(stat.S_IMODE(path.stat().st_mode)) == record['mode']
    r = subprocess.run([sys.executable, '-B', str(tool.ROOT / BASE / 'verify-food.py')],
        check=True, capture_output=True, text=True)
    result = json.loads(r.stdout)
    assert result['checks'] == 569
    for lane, reads, http in [('B', 411, 11), ('C', 425, 10)]:
        facts = result['lanes'][lane]
        assert facts['formal_HTTP'] == 10 and facts['all_HTTP'] == http
        assert facts['INSERT'] == facts['UPDATE'] == facts['DELETE'] == 1
        assert facts['all_readonly_total'] == reads and facts['final_all_state_exact']
        assert facts['transport_false_spy'] == 2 and facts['notifications_spy'] == 3
        receipt = tool.load(BASE + 'private/' + lane + '-main/resource-proof.json')
        assert receipt['source_files'] == 959
    assert result['dates']['B']['automatic_update_time_changed']
    assert not result['dates']['C']['automatic_update_time_changed']
    assert set(x['field'] for x in result['cross_full_DTO_differences']) == {'create_time', 'update_time'}
    pin = tool.load('work/2026-09-28-smart-canteen-dm8-poc/matrix-integration/STORE_APPLICATION_20261011_1034.json')
    assert len(pin) == 959
    for relative, digest in pin.items():
        assert hashlib.sha256((tool.ROOT.parent / 'zhctproject/store/application' / relative).read_bytes()).hexdigest() == digest

def targets():
    result = []
    for action in ['add', 'update', 'delete', 'readById', 'lists']:
        extra = {}
        if action == 'add':
            extra.update(dm_state='tested-fail-source-date0-default-vs-target-nonzero-microsecond',
                parity='partial-equal-add-envelope-but-tested-fail-physical-update_time-default-precision')
        elif action == 'update':
            extra.update(dm_state='tested-fail-source-ON_UPDATE-missing-target-time-stays-original',
                parity='partial-equal-write-envelope-but-tested-fail-physical-automatic-time',
                invalid_type='partial-evidence-edible0-original-error-data-empty-string-no-DML')
        elif action in ['readById', 'lists']:
            extra.update(dm_state='tested-fail-full-DTO-source-date0-vs-target-fraction',
                parity='tested-fail-create_time-format-and-detail-nonzero-update_time-preserved')
        result.append(item('store', 'POST', '/p/food/' + action, BASE,
            scope='customer-primary-only-owned-food-native-CRUD-AI-explicit-failure-Tchef-process-disabled',
            risk='food-numeric-input-native-write-and-date-migration-contract',
            request_type='application/json-string-input-add-number-input-update',
            success_case='partial-evidence-native-CRUD-input-values-pass-date0-and-ON_UPDATE-open',
            boundary_empty_min_max='partial-evidence-edible100-1-valid-0-rejected-delete-detail-null-list-empty',
            cleanup='owned-food-deleted-complete-baseline-restored-runtime-auth-active-for-separately-authorized-read-batch',
            **extra))
    return result

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