#!/usr/bin/env python3
"""Two nonempty export-log reads with preserved red and scoped datetime fix."""
import hashlib
import json
import re
import subprocess
from pathlib import Path
import integrate_20261010 as tool
from integrate_20261011_batches46_48 import item
from integrate_20261012_batch148 import shape

HERE = Path(__file__).resolve().parent
PRIVATE = tool.ROOT.parent / 'worktrees/dm8-compat-20261012/private-prepay-harness/batch156-exportlogs'
BASE = 'work_store/apifox/2026-09-30-dm8-interface-acceptance/parallel-export-log-datetime-20261012/'


def verify():
    def pin(path, digest):
        assert hashlib.sha256(path.read_bytes()).hexdigest() == digest, path.name
    for name, digest in [
        ('REPORT.md', 'cccc4f665ba559a6e8fbb2e7628cf1315277cd71d1aaf4968304e8be7dc5df3b'),
        ('RETEST_REPORT.md', 'd6b98bf34e4cce0ef3d21249f9dff3c60b3639993fbe7210304a9c2877728fbc'),
    ]:
        pin(PRIVATE / name, digest)
        for file, sha in re.findall(r'\| `([\w.-]+)` \| `([0-9a-f]{64})` \|', (PRIVATE / name).read_text()):
            pin(PRIVATE / file, sha)
    for path, digest in [
        ('application/common/service/AsyncExportTaskService.php', 'ca3ffbb8cb1ce27fa86e0a8d4fa6e14d03fa60f0463e040c8c13515612cacbba'),
        ('application/p/controller/SupplementMealOrder.php', '41584146eca5a1b10760b0d98b60c2d7b4051a0b743995d2096932c77b57241e'),
        ('tests/Export/ExportLogDateTimeContractTest.php', '3482e5ef05c5cd2cde9c559cdccdcdaa25d17e6c1a5860e1ea5c557aeffc392b'),
    ]:
        pin(tool.source_root('store') / path, digest)
    docker_root = '/workspace/zhct/worktrees/dm8-compat-20261012/private-prepay-harness/batch156-exportlogs/'
    for file, status in [('verify_initial_offline.php', 'verified-datetime-parity-fail'),
                         ('verify_retest_offline.php', 'verified-parity-pass')]:
        r = json.loads(subprocess.check_output(['docker', 'exec', 'zhctapp_v2_0',
            '/usr/local/php7.3/bin/php', docker_root + file]))
        assert r['status'] == status
    shapes = {}
    for lane in ['B', 'C']:
        for action in ['cashout', 'supplement']:
            prefix = lane + '-exportlogs156-' + action
            old, new = (PRIVATE / (prefix + '.raw')).read_bytes(), (PRIVATE / (prefix + '-retest.raw')).read_bytes()
            expected, actual = json.loads(old), json.loads(new)
            if lane == 'B':
                assert old == new
            else:
                row = expected['data']['data'][0]
                for field in (['operate_time'] if action == 'cashout' else ['create_time', 'operate_time']):
                    assert row[field].endswith('.000000')
                    row[field] = row[field][:-7]
                assert expected == actual and shape(expected) == shape(actual)
            assert isinstance(actual['data'], dict) and isinstance(actual['data']['data'], list)
            assert len(actual['data']['data']) == 1 and actual['data']['total'] == 1
            assert actual['data']['data'][0]['status'] == 5
            shapes[lane, action] = shape(actual)
    for action in ['cashout', 'supplement']:
        assert shapes['B', action] == shapes['C', action]


if __name__ == '__main__':
    audit = HERE / 'integration-20261012-batch156.json'
    assert not audit.exists()
    specs = [item('store', 'POST', '/p/' + controller + '/exportLogs', BASE,
        risk='readonly-owned-inert-status5-export-log-no-export-job-file-or-queue',
        readback='tested-pass-original-full-export-log-rows-unchanged-nonempty-pagination-source-linked',
        success_case='partial-evidence-single-owned-status5-row-original-B-source-guard-warning-preserved-new-worker-SHA-proven',
        parity='partial-evidence-MySQL-wire-byte-identical-DM-only-three-datetime-paths-corrected',
        cleanup='two-status5-empty-path-fixtures-per-engine-retained-no-extra-write-on-retest')
        for controller in ['cashoutOrder', 'supplementMealOrder']]
    tool.main(specs, audit, verify)
