#!/usr/bin/env python3
"""Verify owned version CRUD + 0.01 cash import without replaying any writes."""
import hashlib
import json
import subprocess
import zipfile
from decimal import Decimal
from pathlib import Path
import integrate_20261010 as tool
from integrate_20261011_batches46_48 import item

HERE = Path(__file__).resolve().parent
PRIVATE = tool.ROOT.parent / 'worktrees/dm8-compat-20261012/private-prepay-harness'
BASE = 'work_store/apifox/2026-09-30-dm8-interface-acceptance/parallel-prepay-code-scan-20261012/'
REPORT = BASE + 'VERSION_IMPORT_ROOT_REVIEW.md'


def verify():
    for name, digest in [
        ('batch129-candidate-manifest.sha256', '70ea91321a789ed98c531e25d24159467462df35999ad5c7d746d1c7053be270'),
        ('verify_batch129_candidate.php', '8cf2e14399dbcea72c13bc68b63b66800c22e2b1dd3375f9bfade55935bb0379'),
    ]:
        assert hashlib.sha256((PRIVATE / name).read_bytes()).hexdigest() == digest
    result = json.loads(subprocess.check_output(['/opt/homebrew/opt/php@7.4/bin/php', str(PRIVATE / 'verify_batch129_candidate.php')]))
    assert result['passed'] and result['route_count'] == 4 and result['engine_http_runs'] == 8 and not result['errors']
    read = lambda name: json.loads((PRIVATE / name).read_text())
    for lane in ['B', 'C']:
        add = read(lane + '-equipment-version-add-receipt.json')
        update = read(lane + '-equipment-version-update-receipt.json')
        assert (add['rows_before'], add['rows_after'], update['rows_before'], update['rows_after']) == (0, 1, 1, 1)
        assert add['after_row'] == update['before_row']
        assert add['after_row']['id'] == update['after_row']['id']
        assert add['after_row']['version_number'] != update['after_row']['version_number']
        assert add['route'] == '/p/equipment/addVersion' and update['route'] == '/p/equipment/VersionUpdate'
        with zipfile.ZipFile(PRIVATE / (lane + '-recharge-import-template-verified.xlsx')) as z:
            assert z.testzip() is None and 'xl/worksheets/sheet1.xml' in z.namelist()
        receipt = read(lane + '-recharge-import-owned-receipt.json')
        assert receipt['route'] == '/p/rechargeOrder/import'
        before, after = receipt['before_rows'], receipt['after_rows']
        assert len(before['user']) == len(after['user']) == 1
        assert before['user'][0]['user_id'] == after['user'][0]['user_id']
        order, log = receipt['new_order_rows'][0], receipt['new_cash_log_rows'][0]
        assert int(order['pay_status']) == 20 and order['user_id'] == after['user'][0]['user_id']
        assert str(order['order_id']) == str(log['order_id'])
        for key in ['pay_price', 'actual_money', 'refundable_money']:
            assert Decimal(str(order[key])) == Decimal('0.01')
        assert len(after['orders']) == len(before['orders']) + 1
        assert len(after['logs']) == len(before['logs']) + 1
        for key in ['orders', 'logs']:
            assert all(row in after[key] for row in before[key])


if __name__ == '__main__':
    audit = HERE / 'integration-20261012-batch129.json'
    assert not audit.exists()
    targets = [item('store', 'POST', '/p/equipment/' + action, BASE, evidence=REPORT,
        from_repo='unreviewed', from_source='apifox-2026-05-08',
        risk='device-version-write-owned-type80',
        scope='owned-type80-code77-version-with-no-live-device-consumer-not-real-upgrade',
        readback='tested-pass-original-version0-to1-same-UUID-update-and-independent-exact-cleanup',
        parity='partial-evidence-B-C-original-HTTP-bodies-identical-owned-version-values-readback',
        cleanup='exact-ID-UUID-type-code-version-URL-delete-independent-type80-devices-versions-zero')
        for action in ['addVersion', 'VersionUpdate']]
    targets.append(item('store', 'GET', '/p/rechargeOrder/downTemplate', BASE, evidence=REPORT,
        from_repo='unreviewed', from_source='apifox-2026-05-08',
        mysql_state='partial-evidence-valid-XLSX-download-no-business-database-path',
        dm_state='partial-evidence-valid-XLSX-download-no-business-database-path',
        readback='not-applicable-no-business-DB',
        parity='partial-evidence-original-XLSX-identical-one-sheet-three-headers',
        cleanup='readonly-template-download-private-artifact-retained'))
    targets.append(item('store', 'POST', '/p/rechargeOrder/import', BASE, evidence=REPORT,
        from_repo='unreviewed', from_source='apifox-2026-05-08',
        risk='owned-test-wallet-cash-import', request_type='multipart-XLSX-one-synthetic-staff-row',
        readback='tested-pass-owned-wallet0.04-to0.05-one-paid-recharge-order-and-cash-log0.01-linked',
        parity='partial-evidence-original-HTTP-body-identical-money-source-columns-equal-no-thirdparty',
        cleanup='owned-financial-fixtures-retained-temp-input-removed-phone-restored-independent-readback'))
    tool.main(targets, audit, verify)
