#!/usr/bin/env python3
"""Five real Purchase draft routes, original failures and repaired flow preserved."""
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
P=Path('/Users/wiscourper/Documents/workspace/local/dm8-store-purchase-read3-20261012.L5dTYR/stage3')
S=Path('/Users/wiscourper/Documents/workspace/local/dm8-batch116-20261012.S1TtvG')
BASE='work_store/apifox/2026-09-30-dm8-interface-acceptance/parallel-store-purchase-read3-20261012/'
REPORT=BASE+'PURCHASE_DRAFT_ROOT_REVIEW.md'

def verify():
    for name,pin in {
        'REPORT_PHASE7_FIRST_READ_RED.md':'abd8262d006ecdd939f1fbfcaeeb01a6f6b3e3efedbfad80692513a2cb192a0d',
        'manifest-phase7-red.json':'f536f543d5a2b336c63c9e9da8d275e13030b6eb3b3f7534c8750f7c13cd3145',
        'audit-phase7-red.js':'c36db59c55fcb5642a2dd4b786e5174427da5b7e2506847efb585b56c4900c40',
        'REPORT_PHASE7_FIXED.md':'5bed60ed0d018a4ae1b9c897741dbc05640a25ba61a0c9481e06f5cc73c495f7',
        'manifest-phase7-fixed.json':'af7be473d3be2b013645185496972775ccf7724266378694f02b358fd2b97999',
        'audit-phase7-fixed.js':'b3c46858e89f28daa9fb20c09780727edeca1ae5dfd2f8ef83a1609e593cb759',
    }.items():assert hashlib.sha256((P/name).read_bytes()).hexdigest()==pin
    for mode,checks,assets in [('red',197,112),('fixed',406,144)]:
        result=json.loads(subprocess.check_output(['node',str(P/('audit-phase7-'+mode+'.js')),'--readonly']))
        assert result['readonly'] and result['checks']==checks and result['assets']==assets
    assert hashlib.sha256((tool.source_root('store')/'application/p/logic/Purchase.php').read_bytes()).hexdigest()=='fb54e8b81dc15652d0af83260491c164d0f13abcac32fda992cece42ccb161f0'
    for mode,count,pin in [('shadow',52,'083fc3b9972753a13abf354f52695c7222902831bf7101815ec3a28daf82e3e6'),
                           ('apply',42,'d680d8bd65785431bd91f820a88f1bce29c5959d15b9427458b53706f15c707a')]:
        raw=(S/(mode+'.jsonl')).read_bytes();assert hashlib.sha256(raw).hexdigest()==pin
        events=[json.loads(x) for x in raw.splitlines() if x]
        checks=[e for e in events if 'assertion' in e]
        assert len(checks)==count and all(e['pass'] for e in checks)
        assert json.loads((S/(mode+'.json')).read_text())['status']=='passed'
    for lane in ['B','C']:
        f=json.loads((P/(lane+'-phase7-fixed/phase7-final.json')).read_text())
        assert f['all_own_drafts_softdeleted'] and f['natural_purchase_rows']==0
        assert f['original_actor_config_equal'] and f['own_dependencies_equal']
        assert f['counts']['ydy_purchase_please'][0]['n']==1 and f['counts']['ydy_purchase_son'][0]['n']==2

if __name__=='__main__':
    audit=HERE/'integration-20261012-batch122.json';assert not audit.exists()
    targets=[item('store','POST','/p/Purchase/'+action,BASE,evidence=REPORT,
        from_repo='unreviewed',from_source='apifox-2026-05-08',
        scope='owned-status0-purchase-draft-only-no-approval-actual-procurement-or-external-effects',
        success_case='partial-evidence-add-read-list-update-softdelete-list-empty-real-transactions',
        readback='tested-pass-whole-owned-parent-child-rows-source-DTO-and-auto-update-time-noop-preservation',
        parity='partial-evidence-full-DTO-types-own-source-equal-price-string-and-date-seconds-after-repair',
        cleanup='own-parent-and-two-children-softdeleted-retained-other-four-purchase-tables-zero-no-physical-delete')
        for action in ['add','read','lists','update','delete']]
    tool.main(targets,audit,verify)
