#!/usr/bin/env python3
"""Read-only compiler for a compact review of the immutable full-literal plan."""
import hashlib
import json
from pathlib import Path

r = Path(__file__).parent
raw = (r / 'probe2b-full77-time-proposal.json').read_bytes()
assert hashlib.sha256(raw).hexdigest() == '89343d0caf38bb47b863e6b70e731bbfeb8a10f3a4116ddf1019d5375c96e0fc'
p = json.loads(raw)
b = json.loads((r / 'private-evidence/B-fresh.json').read_text())
latest = [json.loads(line) for line in (r / 'probe2a-private-evidence/B-probe2a.jsonl').read_text().splitlines()]
before, after = [next(e['data'] for e in latest if e['kind'] == kind) for kind in ('business-before', 'business-after')]
sport = next(c for c in b['columns'] if c['column_name'] == 'sport_event_uuid')
assert sport == next(c for c in before['columns'] if c['column_name'] == 'sport_event_uuid') == next(c for c in after['columns'] if c['column_name'] == 'sport_event_uuid')
assert sport['data_type'] == 'mediumtext' and sport['character_octet_length'] == 16777215 and sport['character_set_name'] == 'utf8mb4'


def desc(value, segments):
    assert ''.join(part['text'] * part['repeat'] for part in segments) == value
    return {'segments': segments, 'codepoints': len(value), 'UTF8_bytes': len(value.encode()), 'sha256_UTF8': hashlib.sha256(value.encode()).hexdigest(), 'head2': value[:2], 'tail2': value[-2:]}


def view(value):
    if isinstance(value, str) and len(value) >= 64 and len(set(value)) == 1:
        return {'exact_reconstructible_pattern': desc(value, [{'text': value[0], 'repeat': len(value)}])}
    return value


payload_review = {}
for name, value in p['payloads'].items():
    if name.startswith('LOB_LONG'):
        segments = [{'text': 'X', 'repeat': 68000}, {'text': value[68000:], 'repeat': 1}]
    else:
        segments = [{'text': '😀', 'repeat': 256}, {'text': value[256:], 'repeat': 1}]
    payload_review[name] = desc(value, segments)
    assert payload_review[name]['UTF8_bytes'] < sport['character_octet_length']


def quoted(field, lane):
    return ('`' + field + '`') if lane == 'B' else ('"' + field + '"')


def resolve(value):
    return p['payloads'][value['payload_ref']] if isinstance(value, dict) else value


def bind_type(value):
    value = resolve(value)
    assert type(value) in (str, int, type(None))
    return 0 if value is None else 1 if type(value) is int else 2


review = {'status': p['status'], 'full_literal_private_plan': {'path': 'probe2b-full77-time-proposal.json', 'bytes': len(raw), 'sha256': hashlib.sha256(raw).hexdigest(), 'mode': '0600 ignored; no publication'}, 'source_SPORT_EVENT_UUID_fresh_metadata': sport, 'marker': p['marker'], 'max_rows_each': p['max_rows_each'], 'lease_ids': p['lease_ids'], 'budget': p['budget'], 'business_DDL_DML_HTTP': 0, 'payloads_exact_reconstruction': payload_review, 'binding_rule': 'For every lane, reset baseline_binds below; apply each indexed override. Mutation binds/types are complete below. payload_ref resolves to full_literal_private_plan.payloads[name], whose literal bytes and exact repeat-pattern hashes match above. No trim/round/cast of binds before PDO.', 'column_order': p['columns'], 'source_columns': [{k: c[k] for k in ('column_name', 'column_type', 'is_nullable', 'column_default', 'extra', 'character_set_name', 'collation_name', 'character_octet_length', 'datetime_precision')} for c in b['columns']], 'lanes': {}, 'shared_cases': [], 'residuals': p['residuals']}
for lane, spec in p['lanes'].items():
    base = [p['baseline_values'][field] for field in p['columns']] + [1]
    reset_SQL = 'UPDATE ' + spec['table'] + ' SET ' + ','.join(quoted(f, lane) + '=?' for f in p['columns']) + ' WHERE ' + quoted('ID', lane) + '=?'
    review['lanes'][lane] = {key: spec[key] for key in ('table', 'create_table', 'create_unique_index', 'create_trigger', 'seed', 'clock_SQL', 'readback_SQL', 'LOB_readback_rule', 'diagnostics_B_only_SQL', 'cleanup')}
    review['lanes'][lane]['reset_SQL'] = reset_SQL
    review['lanes'][lane]['baseline_reset_binds'] = base
    review['lanes'][lane]['baseline_reset_PDO_types'] = [bind_type(v) for v in base]
    for case in spec['cases']:
        binds = base.copy()
        for field, value in case['reset_overrides'].items():
            binds[p['columns'].index(field)] = value
        assert case['reset'] == {'SQL': reset_SQL, 'binds': binds, 'PDO_types': [bind_type(v) for v in binds]}
        values = case['set_values']
        sql = 'UPDATE ' + spec['table'] + ' SET ' + ','.join([quoted(f, lane) + '=?' for f in values] + [quoted(f, lane) + '=' + quoted(f, lane) for f in case['self_columns']]) + ' WHERE ' + quoted('ID', lane) + '=?'
        params = list(values.values()) + [1]
        assert case['mutation'] == {'SQL': sql, 'binds': params, 'PDO_types': [bind_type(v) for v in params]}
for bcase, ccase in zip(p['lanes']['B']['cases'], p['lanes']['C']['cases']):
    for key in ('label', 'reset_overrides', 'set_values', 'self_columns', 'expected_time', 'field_coverage', 'explicit_time'):
        assert bcase.get(key) == ccase.get(key)
    assert bcase['reset']['binds'] == ccase['reset']['binds'] and bcase['mutation']['binds'] == ccase['mutation']['binds']
    case = {k: bcase[k] for k in ('label', 'field_coverage', 'expected_time', 'explicit_time', 'invalid_source', 'observe_warnings_B') if k in bcase}
    case['reset_override_indexed_binds'] = [{'column': field, 'one_based_index': p['columns'].index(field) + 1, 'value': view(value), 'PDO_type': bind_type(value)} for field, value in bcase['reset_overrides'].items()]
    case['mutation_SQL'] = {lane: candidate['mutation']['SQL'] for lane, candidate in [('B', bcase), ('C', ccase)]}
    case['mutation_binds'] = [view(v) for v in bcase['mutation']['binds']]
    case['mutation_PDO_types'] = bcase['mutation']['PDO_types']
    review['shared_cases'].append(case)
assert len(review['shared_cases']) == 108
print(json.dumps(review, ensure_ascii=False, indent=2))
