#!/usr/bin/env python3
"""Four original device CRUD endpoints, only two owned nonprinter fixtures."""
import hashlib
import json
from pathlib import Path
import subprocess
import integrate_20261010 as tool
from integrate_20261011_batches46_48 import item
HERE=Path(__file__).resolve().parent
BASE='work_store/apifox/2026-09-30-dm8-interface-acceptance/parallel-prepay-code-scan-20261012/'
REPORT=BASE+'DEVICE_CRUD_ROOT_REVIEW.md'

def verify():
    m=json.loads((tool.ROOT/BASE/'DEVICE_CRUD_MANIFEST.json').read_text());p=Path(m['private_root'])
    assert len(m['files'])==17
    for f in m['files']:assert hashlib.sha256((p/f['name']).read_bytes()).hexdigest()==f['sha256']
    r=json.loads(subprocess.check_output(['/opt/homebrew/opt/php@7.4/bin/php',str(p/'verify_device_crud.php')]))
    assert r['passed'] and r['engine_runs']==8 and not r['errors'] and len(r['new_route_keys'])==4
    for lane,own in [('B',233),('C',179)]:
        records={stage:json.loads((p/(lane+'-device-'+stage+'-receipt.json')).read_text()) for stage in ['add','update','genCode','del']}
        first=records['add'];assert first['rows_before']==0 and first['rows_after']==1 and int(first['row_after']['id'])==own
        assert int(first['row_after']['type'])==60
        for stage in ['update','genCode','del']:
            assert int(records[stage]['before_row']['id'])==own and int(records[stage]['after_row']['id'])==own
            assert records[stage]['xpyun_stub_events_delta']==0
        assert int(records['del']['after_row']['del_flag'])==1
        assert records['genCode']['pairing_response_matches_original_row']

if __name__=='__main__':
    audit=HERE/'integration-20261012-batch126.json';assert not audit.exists()
    targets=[item('store','POST','/p/equipment/'+action,BASE,evidence=REPORT,
        from_repo='unreviewed',from_source='apifox-2026-05-08',
        scope='new-owned-type60-nonprinter-device-only-original-dev-and-DM-databases',
        success_case='partial-evidence-add-update-generate-pairing-code-softdelete-no-real-hardware',
        readback='tested-pass-exact-owned-device0-to1-update-pairing-hash-and-softdelete-chain',
        parity='partial-evidence-add-update-delete-original-body-equal-pairing-value-random-type-and-source-match',
        cleanup='two-new-marked-devices-softdeleted-original-devices-unchanged-Xpyun-stub-zero')
        for action in ['add','update','genCode','del']]
    tool.main(targets,audit,verify)
