#!/usr/bin/env python3
"""Upgrade Weight's empty-join-only evidence with a real populated join."""
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/batch160-weight-join'
BASE = 'work_store/apifox/2026-09-30-dm8-interface-acceptance/parallel-weight-populated-join-20261012/'


def verify():
    for name, digest in [('REPORT.md', '662c3f822f903ae79de624762abed3d5258792514e612c872faef8e2f404a7ae'),
                         ('RETEST_REPORT.md', 'cf95f78fc6d6d3dc5b72f0dfddfe7b0976e7f27424d8fc121aa6160cc6e90031')]:
        report = PRIVATE / name
        assert hashlib.sha256(report.read_bytes()).hexdigest() == digest
        for file, sha in re.findall(r'\| `([\w.-]+)` \| `([0-9a-f]{64})` \|', report.read_text()):
            assert hashlib.sha256((PRIVATE / file).read_bytes()).hexdigest() == sha
    for file, digest in [('application/p/logic/Weight.php', '60065d3238e26a20573663f85472540801915879f9d307bfd243b7376c9b9d7a'),
                         ('tests/Weight/WeightListDateTimeContractTest.php', '894d1f8484ae4f520406efef99c31fcb217bc7765351b70bba0bbd354619c239')]:
        assert hashlib.sha256((tool.source_root('store') / file).read_bytes()).hexdigest() == digest
    for file, status in [('verify_initial_offline.php', 'verified-single-datetime-parity-fail'),
                         ('verify_retest_offline.php', 'verified-single-row-join-parity-pass')]:
        result = json.loads(subprocess.check_output(['docker', 'exec', 'zhctapp_v2_0', '/usr/local/php7.3/bin/php',
            '/workspace/zhct/worktrees/dm8-compat-20261012/private-prepay-harness/batch160-weight-join/' + file]))
        assert result['status'] == status
    bodies = []
    for lane in ['B', 'C']:
        old = (PRIVATE / (lane + '-weight160-lists.raw')).read_bytes()
        new = (PRIVATE / (lane + '-weight160-lists-retest.raw')).read_bytes()
        expected, actual = json.loads(old), json.loads(new)
        if lane == 'B':
            assert old == new
        else:
            value = expected['data']['rows'][0]['create_time']
            assert value == '2026-10-12 12:34:56.000000'
            expected['data']['rows'][0]['create_time'] = value[:-7]
            assert expected == actual and shape(expected) == shape(actual)
        assert isinstance(actual['data']['rows'], list) and len(actual['data']['rows']) == 1
        row = actual['data']['rows'][0]
        assert type(row['weight']) is float and row['weight'] == 61.37
        assert row['status'] == '2' and row['pbf'] == '18.50' and row['energy_value'] == 1800
        for name in ['uuid', 'name']:
            assert isinstance(row.pop(name), str)
        bodies.append(actual)
    assert bodies[0] == bodies[1] and shape(bodies[0]) == shape(bodies[1])


if __name__ == '__main__':
    audit = HERE / 'integration-20261012-batch160.json'
    assert not audit.exists()
    specs = [item('store', 'POST', '/p/weight/lists', BASE,
        readback='tested-pass-five-owned-original-rows-unchanged-real-populated-weight-status-join',
        success_case='partial-evidence-single-populated-measurement-join-plus-prior-empty-join-not-multi-history',
        parity='partial-evidence-whole-JSON-nonidentity-equal-FLOAT-ENUM-int-preserved-DM-only-time-normalized',
        performance='partial-evidence-own-indexed-staff-small-inner-tables-not-large-table-or-latest-history-proof',
        cleanup='owned-single-weight-status-row-and-prior-department-link-retained-no-Staff-update')]
    tool.main(specs, audit, verify)
