#!/usr/bin/env python3
"""Monitoring original red plus repaired full-row/response/delete evidence."""
import base64
import hashlib
import json
from pathlib import Path
import subprocess
import sys
import integrate_20261010 as tool
from integrate_20261011_batches46_48 import item

HERE = Path(__file__).resolve().parent
STAGE = Path('/Users/wiscourper/Documents/workspace/local/dm8-store-purchase-read3-20261012.L5dTYR/stage3')
BASE = tool.STORE + 'parallel-monitoring-crud-20261013/'


def verify():
    for number, report, manifest, verifier, checks, assets in [
        (232, '9d6bbc53f945ee18c797f9387c9661b87615e413d4443186dcd8355addb57ee0',
         '6bc709692f3c5cb5df240c8c1a078b77250b8f818099be0f0ffbac9378253055',
         '02d74bee85e5b2ef8b48f8838faeec63d215117fcd659d7774cc77a96c4dba55', 566, 99),
        (235, '9de29889bbb4badc64e48df0aac5adb3f8b682974f12237a8d2f30ebc010a2f4',
         '8a03677d3176d419eb796ee8c0cf24b4de33438f30c41a0ae0af429aaa738243',
         '0c58e22868488d2617851642dff512f070ee44660b9fa18e135f305c42aba53e', 841, 130),
    ]:
        root = STAGE / f'bio{number}-20261013' / f'execution{number}'
        for name, digest in {f'REPORT{number}.md': report, f'manifest{number}.json': manifest,
                f'verify{number}.py': verifier}.items():
            assert hashlib.sha256((root / name).read_bytes()).hexdigest() == digest
        r = json.loads(subprocess.check_output([sys.executable, '-B', str(root / f'verify{number}.py')]))
        assert r['checks'] == checks and r['assets'] == assets and r['float_high_domain_closed'] is False
    def load(number, lane, name):
        return json.loads((STAGE / f'bio{number}-20261013/execution{number}/evidence-{lane}/private' / name).read_text())
    old = load(232, 'C', 'response-A232.json')
    fixed = load(235, 'C', 'response-A235.json')
    raw_actor = next(n['lease']['data']['create_by'] for n in old['native'] if n['kind'] == 'write')
    new_actor = next(n['lease']['data']['create_by'] for n in fixed['native'] if n['kind'] == 'write')
    assert len(raw_actor) == 36 and new_actor == raw_actor[:32]
    b = json.loads(base64.b64decode(load(235, 'B', 'response-I1235.json')['body_base64']))
    c = json.loads(base64.b64decode(load(235, 'C', 'response-I2235.json')['body_base64']))
    assert b['data']['project'] == 'CDXBIO13W1' and c['data']['project'] == 'CDXBIO13W2'
    assert b['data']['demo'] == 'CDXBIO13W1_B' and c['data']['demo'] == 'CDXBIO13W2_B'
    for key in ('id', 'uuid', 'staff_uuid', 'create_by', 'create_time', 'project', 'demo'):
        assert type(b['data'][key]) is type(c['data'][key])
        b['data'][key] = c['data'][key]
    assert b == c
    source = tool.source_root('store')
    for name, digest in {
        'application/p/logic/EngineryIochemistry.php': 'b6d11e91ddd6fe1c2cb4b1c0775e1b2b02a703c69326e4192fa97db74ba8a3a5',
        'application/model/EngineryIochemistry.php': '277b1a980e4e5970542fdee8fbc9f1253627dbdf48fd8f5441abefe87e8aeceb',
        'tests/Archives/ArchiveCreatorContractTest.php': 'e0d656a4a524fca339357c102657cac47bec05eba3d2f9ca65703f0da0afe6d2',
        'tests/Archives/EngineryTimeContractTest.php': '0e139f1a3ad316a2d726300548553658c2ed311b9f9f0b1504b6e4be0719726a',
    }.items():
        tested = subprocess.check_output(['git', '-C', str(source), 'show',
            'ace4257f5b1adc7f94b42ea9068c2e4fe7c8d31b:' + name])
        assert hashlib.sha256(tested).hexdigest() == digest
    subprocess.run(['git', '-C', str(source), 'merge-base', '--is-ancestor',
        'ace4257f5b1adc7f94b42ea9068c2e4fe7c8d31b', 'develop_dameng'], check=True)


if __name__ == '__main__':
    audit = HERE / 'integration-20261013-batch235.json'
    assert not audit.exists(), 'Never replay integration main'
    specs = [item('store', 'POST', '/p/engineryIochemistry/' + action, BASE,
        success_case='partial-evidence-owned-monitoring-232B-235C-creator-red-fixed-numberic-one-only',
        readback='tested-pass-full9-native-ID-owned-I-U-D-physical-float-kept-no-high-domain-claim',
        parity='partial-evidence-complete-DTO-source-values-types-MySQL-wire-unchanged-DM-zero-fraction')
        for action in ('add', 'update', 'delete', 'info')]
    specs.append(item('store', 'POST', '/p/engineryIochemistry/lists', BASE,
        mysql_state='partial-evidence-owned-empty-list-after-delete-only', dm_state='partial-evidence-owned-empty-list-after-delete-only',
        success_case='partial-evidence-empty-rows-list-total-zero-not-nonempty-list',
        mysql_readback='partial-evidence-owned-empty-scope', dm_readback='partial-evidence-owned-empty-scope',
        readback='partial-evidence-real-empty-query-after-owned-delete'))
    tool.main(specs, audit, verify)
