#!/usr/bin/env python3
"""Root single intake of three bounded, real RPE write scenarios."""
import hashlib
import json
import subprocess
from pathlib import Path
import integrate_20261010 as tool
from integrate_20261011_batches46_48 import item
from integrate_20261013_batches221_223_224_226 import shape

HERE = Path(__file__).resolve().parent
BASE = tool.ROOT.parent / 'worktrees/dm8-compat-20261012/private-prepay-harness'
ROOT = BASE / 'batch271-rpe-fixed-new-dates'
PHP = '/opt/homebrew/opt/php@7.4/bin/php'
REPORT = tool.STORE + 'parallel-rpe-three-write-20261013/ROOT_REVIEW.md'
COMMIT = 'cf32f6249259f2d28dbfecddd19b6ce0c6819697'
ACTIONS = {'TEMPERATURE': 'addTemperature', 'ENGINERY': 'addEenginery', 'SINGLE': 'addSingle'}


def pin(file, sha):
    assert hashlib.sha256(file.read_bytes()).hexdigest() == sha, file.name


def verify():
    for name, sha in {
        'REPORT271.md': 'd92a2a6ea6eb816cac7d262ac0f19a33b79b79f110c88107d5bbddea72f51204',
        'verify271.php': '4ddd95683bcb89ad5050627508e041e6fd796181a820f1583a892a7bbd8bcf02',
        'manifest271.json': 'a563a5e1c849597b518210e2f6ede0fe63f2649817f1edd5a32824a9734a4d49',
    }.items():
        pin(ROOT / name, sha)
    assets = json.loads((ROOT / 'manifest271.json').read_text())['assets']
    assert len(assets) == 172
    for asset in assets:
        relative = Path(asset['path'])
        assert not relative.is_absolute() and '..' not in relative.parts
        file = ROOT / relative
        assert file.stat().st_size == asset['bytes']
        pin(file, asset['sha256'])
    result = json.loads(subprocess.check_output([PHP, str(ROOT / 'verify271.php')]))
    assert result['passed'] and result['assertions'] == 468 and result['new_pairs_each'] == 3
    for lane in ('B', 'C'):
        side = ROOT / ('execution-' + lane)
        source = json.loads((side / 'source271.json').read_text())
        for file, path in {'RpeController.php': 'application/p/controller/Rpe.php',
                           'RpeLogic.php': 'application/p/logic/Rpe.php',
                           'RpeModel.php': 'application/model/Rpe.php',
                           'RpeValidate.php': 'application/validate/Rpe.php'}.items():
            raw = subprocess.check_output(['git', '-C', str(tool.source_root('store')), 'show', COMMIT + ':' + path])
            assert hashlib.sha256(raw).hexdigest() == source[file]
        for case, action in ACTIONS.items():
            sent = json.loads((side / ('sent-' + case + '.json')).read_text())
            assert sent['attempt'] == 1 and sent['case']['path'] == '/p/rpe/' + action
            wire = json.loads((side / ('wire-' + case + '.json')).read_text())
            body = json.loads((side / ('response-' + case + '.raw')).read_text())
            assert wire['http'] == 200 and body == wire['json'] and shape(body) == shape(wire['json'])
            assert type(body['code']) is int and body['code'] == 0 and body['message'] == '添加成功'
            prior = json.loads((side / ('before-' + case + '.json')).read_text())
            after = json.loads((side / ('after-' + case + '.json')).read_text())['snapshot']
            assert after['staff'] == prior['staff'] and shape(after['staff']) == shape(prior['staff'])
            assert after['rpe'][:-1] == prior['rpe'] and after['info'][:-1] == prior['info']
    subprocess.check_call(['git', '-C', str(tool.source_root('store')), 'merge-base', '--is-ancestor', COMMIT, 'develop_dameng'])


if __name__ == '__main__':
    audit = HERE / 'integration-20261013-rpe271.json'
    assert not audit.exists(), 'Never replay integration main'
    rows = [item('store', 'POST', '/p/rpe/' + action, '', evidence=REPORT,
        request_type='application/x-www-form-urlencoded',
        success_case='partial-evidence-owned-new-day-parent-child-real-transaction-commit',
        readback='tested-pass-full13-parent-full9-child-values-types-links-native-defaults-and-Staff77-unchanged',
        parity='partial-evidence-original-complete-code-message-equal-new-day-only-existing-menu-warning-changes-see-report',
        cleanup='marked-new-pairs-retained-old270-rows-unchanged-workers-stopped-no-real-external')
        for action in ACTIONS.values()]
    tool.main(rows, audit, verify)
