#!/usr/bin/env python3
"""Two repaired read contracts, one strengthened list, one Bill date decision."""
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
MIRROR = Path('/Users/wiscourper/Documents/workspace/local/dm8-sealed-ai-20261013.4PoFa9')
FINANCE = tool.ROOT.parent / 'worktrees/dm8-compat-20261012/private-prepay-harness'
AI = tool.AI + 'parallel-decimal-read-regression-20261013/'
STORE = tool.STORE + 'parallel-bill-isupdate-20261013/'
PHP = '/opt/homebrew/opt/php@7.4/bin/php'


def pin(path, sha):
    assert hashlib.sha256(path.read_bytes()).hexdigest() == sha, str(path)


def verify():
    root = MIRROR / 'meal246-decimal-read-regression'
    pin(root / 'REPORT_246.md', '2057633616e4003b95cc7c5ab8b79ceb631ba997afe914d8221c26404b11b4e4')
    pin(root / 'verify246.php', '5d6391fb1f6b6a9ca943e664c48f3f77f4334caf631b9bf1288c2d3a9b463a73')
    pin(root / 'run246-B.json', 'd2eb3ba7c2b0c6b2e26ca0d265ecdfea1dbdfca3c589f4a3f5afbfa6be4316e9')
    pin(root / 'run246-C.json', '3d78d4c5ca35bc4ac0b32a4713ec2ea3c9c5623e14a8c42403672063830f2690')
    r = json.loads(subprocess.check_output([PHP, str(root / 'verify246.php')]))
    assert r['checks'] == 68 and r['status'] == '246-two-decimal-read-contracts-pass'
    root = MIRROR / 'meal248-refund-list'
    pin(root / 'REPORT_248.md', 'ecaa7a62c5a5fcf22aa5d76268e4cc0dd1350d8b8221dfd8c8701b609d3d9278')
    pin(root / 'verify248.php', '6a3c7fdc89f240a19ad4f5b731b48e64afa9ec60fc3382df612c5e740711cd5a')
    pin(root / 'run248-B.json', '000032a0af0718cbc324c900e6a61ad28fe5c17cd7a627c5061fff484268e558')
    pin(root / 'run248-C.json', 'e35171e69aac12fea91946aff24a24084a4d60865be43baa5212aa68293deee9')
    assert json.loads(subprocess.check_output([PHP, str(root / 'verify248.php')]))['checks'] == 56
    root = FINANCE / 'batch247-bill-past-retest'
    pin(root / 'REPORT247.md', '640a3a308973163dcf7d431c72d063234084d57aeb73c8a396f0cfb4c0cade50')
    pin(root / 'verify247.php', '703ff4485cd01c1c8278561afa668bb24bf9a9bcc4fa9135e3a80d5a8e4ce11c')
    pin(root / 'manifest247.json', '95c94d001073fbea2d19ad253b7982b13e578663014a12c884e51e5e83d5387b')
    assert json.loads(subprocess.check_output([PHP, str(root / 'verify247.php')]))['assertions'] == 77
    assert json.loads(subprocess.check_output([PHP, str(FINANCE / 'batch244-bill-isupdate-read/verify_244_offline.php')]))['assertions'] == 97
    for path, sha in [('app/api/model/OrderRefund.php', '5541ce45e0ac80b52cc491e485fbe90aecb1476e33d8d4524fbc3b7031a5d25c'),
                      ('app/api/service/order/Checkout.php', '7117d701245b00a90537806c45f438e53cf88d27f56bdbfff95f0069cf52c3e6')]:
        raw = subprocess.check_output(['git', '-C', str(tool.source_root('ai_api')), 'show', '61128f5d37704937f1c5a91f222b82af9f56763a:' + path])
        assert hashlib.sha256(raw).hexdigest() == sha


if __name__ == '__main__':
    audit = HERE / 'integration-20261013-batches246-247-248.json'
    assert not audit.exists(), 'Never replay integration main'
    rows = [item('ai_api', 'GET', path, AI,
                 success_case='partial-evidence-original-owned-zero-money-read-after-DM-only-decimal-fix',
                 parity='partial-evidence-full-original-typed-JSON-B-unchanged-C-only-proven-decimal-leaf',
                 readback='tested-pass-full-owned-row-and-setting-protection-no-DML')
            for path in ['/api/refund/detail', '/api/checkout/order']]
    rows.append(item('ai_api', 'GET', '/api/refund/list', AI,
                     success_case='partial-evidence-own-nonempty-pagination-and-empty-state30',
                     boundary_empty_min_max='partial-evidence-one-owned-refund-and-original-empty-last-page-zero',
                     readback='tested-pass-thirteen-full-row-and-ID-scopes-unchanged'))
    rows.append(item('store', 'POST', '/p/bill/isUpdate', STORE,
                     success_case='partial-evidence-stable-past-and-future-date-boolean-decisions',
                     request_type='application/x-www-form-urlencoded',
                     boundary_empty_min_max='not-tested-same-day-meal-time-window',
                     readback='tested-pass-original-identity-and-config-read-hashes-unchanged'))
    tool.main(rows, audit, verify)
