#!/usr/bin/env python3
"""PAL known-key regression and three original nonempty dashboard/export keys."""
import hashlib
import json
import subprocess
import sys
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
PAL = Path('/private/tmp/cdx-ai-hk-course-b.Kmdirn/review-s1-314-320/verify_review.py')
BASE = tool.ROOT.parent / 'worktrees/dm8-compat-20261012/private-prepay-harness'
DASH = BASE / 'batch281-zgyh-read'
PHP = '/opt/homebrew/opt/php@7.4/bin/php'
REPORT = tool.STORE + 'parallel-pal-stamp-dashboard-20261013/ROOT_REVIEW.md'


def verify():
    assert hashlib.sha256(PAL.read_bytes()).hexdigest() == '46f3755beae07484a6a282e572e906c9237665b499c6b57d29debcc0c100160c'
    pal = json.loads(subprocess.check_output([sys.executable, '-B', str(PAL)]))
    assert pal['verified_bounded_evidence'] and pal['checks'] == 2349 and pal['original_HTTP'] == 47
    for folder in [DASH, DASH / 'post-export-followup']:
        manifest = json.loads((folder / 'MANIFEST.json').read_text())
        for name, meta in manifest.items():
            p = folder / name
            assert not Path(name).is_absolute() and '..' not in Path(name).parts
            assert p.stat().st_size == meta['bytes'] and hashlib.sha256(p.read_bytes()).hexdigest() == meta['sha256']
    first = json.loads(subprocess.check_output([PHP, str(DASH / 'verify281.php')]))
    post = json.loads(subprocess.check_output([PHP, str(DASH / 'post-export-followup/verify_post281.php')]))
    assert first['checks'] == 70 and post['checks'] == 120
    assert post['cumulative_read_totals'] == {'B': 120, 'C': 174}
    for lane in ('B', 'C'):
        raw = json.loads((DASH / (lane + '-dashboard-wire.json')).read_text())
        body = json.loads((DASH / raw['body_file']).read_bytes())
        del body['trace_id']
        expected = json.loads((DASH / ('oracle-' + lane + '.json')).read_text())['json']
        assert body == expected and shape(body) == shape(expected)
        for mode, folder in [('get', DASH), ('post', DASH / 'post-export-followup')]:
            proof = json.loads((BASE / 'root-281-offline.8VpZNX' / mode / ('cells-' + lane + '.json')).read_text())
            assert proof['checks'] == 950 and proof['failures'] == [] and proof['DB'] == proof['HTTP'] == 0
            assert proof['source_file_sha256'] == hashlib.sha256((folder / (lane + '-export.xls')).read_bytes()).hexdigest()
            original = json.loads((folder / ('cells-' + lane + '.json')).read_text())
            assert proof['cells'] == original['cells'] and shape(proof['cells']) == shape(original['cells'])
    for cls, sha in json.loads((DASH / 'source-pins.json').read_text()).items():
        path = 'application/' + cls[4:].replace('\\', '/') + '.php'
        source = subprocess.check_output(['git', '-C', str(tool.source_root('store')), 'show', 'e379012c15c14d2a737946e31cc5fe51d76c8404:' + path])
        assert hashlib.sha256(source).hexdigest() == sha
    subprocess.check_call(['git', '-C', str(tool.source_root('store')), 'merge-base', '--is-ancestor', '41b991ed2f7bd23c16f4b5a6bff19ff77b2412eb', 'develop_dameng'])


if __name__ == '__main__':
    audit = HERE / 'integration-20261013-pal-and-dashboard.json'
    assert not audit.exists(), 'Never replay integration main'
    rows = [item('store', method, path, '', evidence=REPORT,
        success_case='partial-evidence-owned-nonempty-weight-dashboard-full-JSON-and-original-Excel5',
        readback='tested-pass-all8-native-source-rows-unchanged-and-independent-statistics-cell-oracle',
        parity='partial-evidence-full-JSON-leaf-types-and-real-four-files-all475cells-values-types',
        cleanup='eight-owned-marker-rows-retained-workers-stopped-no-HTTP-business-writes')
        for method, path in [('POST', '/p/zgyh/dashboard'), ('GET', '/p/zgyh/dashboardExport'), ('POST', '/p/zgyh/dashboardExport')]]
    rows.append(item('store', 'POST', '/p/metabolismpal/querylistupdate', '', evidence=REPORT, evidence_only=True))
    tool.main(rows, audit, verify)
