#!/usr/bin/env python3
"""Admin Store index partial; B-only recycle remains limited."""
import hashlib
import json
import subprocess
from datetime import datetime
from pathlib import Path
from zoneinfo import ZoneInfo
import integrate_20261010 as tool
from integrate_20261011_batches46_48 import item

HERE = Path(__file__).resolve().parent
ROOT = tool.ROOT.parent / 'worktrees/dm8-compat-20261012/private-prepay-harness/batch234-ai-admin-store-read-plan'
BASE = tool.AI + 'parallel-admin-store-reads-20261013/'


def verify():
    pins = {'REPORT.md': '27a7fc639db8ccaeb5f8a4247174b09e56c232d598dd4e2f5e73c16cdd82b955',
            'verify_234_offline.php': '363a68cc0739d5a4bde23324dc0019a7187ae840d9e177822f0b3c93b77ce371',
            'B-234-index-receipt.json': '84a40c2b568f1bd331dfa7c68aca67fd59fa34262eab43583ff1bbf87a9afc65',
            'C-234-index-v2-receipt.json': '8eabfdf76974cea12f494f095419571b24279d704c565bfd1e3a60386e56ab7c'}
    for name, sha in pins.items():
        assert hashlib.sha256((ROOT / name).read_bytes()).hexdigest() == sha, name
    r = json.loads(subprocess.check_output(['/opt/homebrew/opt/php@7.4/bin/php', str(ROOT / 'verify_234_offline.php')]))
    assert r['checks'] == 398 and r['recycle_C_not_tested'] is True
    integer_fields = {'group_id', 'is_delete', 'is_recycle', 'logo_image_id', 'sort', 'status', 'store_id', 'version_type'}
    count = conversions = 0
    for stem, size in [('B-234-index', 14), ('C-234-index-v2', 5)]:
        rows = json.loads((ROOT / (stem + '-source-before.json')).read_text())
        source = {str(r['store_id']): r for r in rows if int(r['is_delete']) == int(r['is_recycle']) == 0}
        body = json.loads((ROOT / (stem + '.raw')).read_text())
        assert type(body['data']) is dict and type(body['data']['list']) is dict
        items = body['data']['list']['data']
        assert type(items) is list and len(items) == len(source) == size
        for item_row in items:
            row = source[str(item_row['store_id'])]
            assert set(row) == set(item_row)
            for key, native in row.items():
                expected = native
                if key in {'create_time', 'update_time'} and native is not None:
                    epoch = int(native)
                    expected = datetime.fromtimestamp(epoch, ZoneInfo('Asia/Shanghai')).strftime('%Y-%m-%d %H:%M:%S') if epoch > 0 else None
                elif key in integer_fields and stem.startswith('B'):
                    assert type(native) is str and str(int(native)) == native
                    expected = int(native)
                    conversions += 1
                assert type(expected) is type(item_row[key]) and expected == item_row[key], key
                count += 1
    assert count == 342 and conversions == 112


if __name__ == '__main__':
    audit = HERE / 'integration-20261013-batch234.json'
    assert not audit.exists(), 'Never replay integration main'
    tool.main([
        item('ai_api', 'GET', '/admin/Store/index', BASE,
             success_case='partial-evidence-original-nonempty-admin-store-list-per-engine-source',
             readback='tested-pass-full-source-values-with-eight-explicit-B-observer-integer-representations',
             parity='partial-evidence-full-keys-types-and-per-source-values-different-natural-snapshots'),
        item('ai_api', 'GET', '/admin/Store/recycle', BASE,
             mysql_state='partial-evidence-B-empty-only', dm_state='not-tested',
             success_case='partial-evidence-B-only-empty-recycle',
             mysql_readback='partial-evidence-B-empty-filter-source-confirmed', dm_readback='not-tested',
             parity='not-compared-C-recycle-not-requested',
             readback='partial-evidence-B-only-empty-recycle-source')
    ], audit, verify)
