#!/usr/bin/env python3
"""Accept a fresh Weight/RPE chain and correct a source-only flag interpretation."""
import hashlib
import json
import subprocess
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/batch189-weight-rpe-green'
BASE = 'work_store/apifox/2026-09-30-dm8-interface-acceptance/parallel-weight-rpe-parity-20261013/'
XLS = 'work_store/apifox/2026-09-30-dm8-interface-acceptance/parallel-meal-plan-xlsx-20261013/'


def verify():
    for name, digest in [
        ('REPORT.md', '3f82144d99a6d69320d7def89131cb669955c0cdf28ebfcaad4c62053c465bfc'),
        ('verify_green_offline.php', '3f1ca8a45de2f5503f176e5cb81af4fabae5480355fff8faf9b36434f5fdb1ed'),
    ]:
        assert hashlib.sha256((PRIVATE / name).read_bytes()).hexdigest() == digest
    r = json.loads(subprocess.check_output(['/opt/homebrew/opt/php@7.4/bin/php', str(PRIVATE / 'verify_green_offline.php')]))
    assert r['status'] == 'verified-green' and r['formal_HTTP_total'] == 2
    assert r['raw_wire_identical'] and r['own_row_counts_and_fields_equal']
    receipts = {lane: json.loads((PRIVATE / (lane + '-weight189-http-receipt.json')).read_text()) for lane in ('B', 'C')}
    for table, rows in receipts['B']['own_related_full_rows_after'].items():
        other = receipts['C']['own_related_full_rows_after'][table]
        assert len(rows) == len(other)
        for left, right in zip(rows, other):
            assert set(left) == set(right)
    for name, digest in [
        ('application/model/Rpe.php', 'a53526bc14f7fb884b4ec6b40d28acf87919e44c40843d19864b96f68b0b3850'),
        ('application/p/logic/DateMenu.php', 'd995e1fb62b60a8a92344bebc80d0aa6f7a97526928c99515e009b7f43dc366b'),
    ]:
        assert hashlib.sha256((tool.source_root('store') / name).read_bytes()).hexdigest() == digest
    import integrate_20261013_batch184
    integrate_20261013_batch184.verify()
    correction = tool.ROOT.parent.parent / 'local/dm8-store-purchase-read3-20261012.L5dTYR/stage3/template-export184-flags-addendum-20261013/ADDENDUM184_FLAGS_20261013.md'
    assert hashlib.sha256(correction.read_bytes()).hexdigest() == '486415ea15705cf43ccee2e4017b1fe22c39a3d85c84082799a797f23ab4ebdc'


if __name__ == '__main__':
    audit = HERE / 'integration-20261013-batch189.json'
    assert not audit.exists(), 'Preserve original red and new green transitions'
    specs = [item('store', 'POST', '/p/weight/add', BASE,
        evidence=BASE + 'GREEN189.md',
        risk='owned-single-day-real-weight-RPE-recommendation-chain-external-hard-isolation',
        readback='tested-pass-full-own-weight-status-RPE1-info2-menu1-and-private-Redis',
        mysql_readback='tested-pass-code-local-own-full-row-values-and-private-key',
        dm_readback='tested-pass-native-own-full-rows-RPE-creator-matches-Mysql-prefix32',
        parity='partial-evidence-original-HTTP-bytes-identical-and-business-values-equivalent',
        success_case='partial-evidence-new-189-fixture-complete-positive-chain-original187-kept',
        cleanup='fresh-marked-fixtures-retained-no-replay-no-global-SQL-trace-claim')]
    # No extra HTTP and no extra pass: only correct the original enum description.
    specs.append(item('store', 'GET', '/p/bill/exportMealPlanTemplate', XLS,
        risk='actual-original-XLSX-writer-real-recipe-join-no-external',
        readback='tested-pass-B29-C1-source-projection-to-XLSX-cells-native-types-order-date-style',
        parity='partial-evidence-each-source-verified-XLSX-not-equal-historical-data',
        success_case='partial-evidence-nonempty-original-export-C-owned-active-association-enum-corrected',
        boundary_empty_min_max='partial-evidence-empty-header-only-and-over31day-original-rejection',
        cleanup='own-workers-tokens-cache-zero-single-C-synthetic-recipe-retained-protected-source-unchanged'))
    tool.main(specs, audit, verify)
