#!/usr/bin/env python3
"""Compare this owned dictionary batch without coercing JSON types or array order."""
import importlib.util
import json
from pathlib import Path
import sys

here = Path(__file__).resolve().parent
path = here.parents[2] / 'work/2026-09-28-smart-canteen-dm8-poc/http-harness/strict_response_compare.py'
spec = importlib.util.spec_from_file_location('strict', path)
strict = importlib.util.module_from_spec(spec)
spec.loader.exec_module(strict)

def checked(path, lane):
    data = strict.load_json(path)
    assert data['lane'] == lane and data['boundary_verified'] is True and data['error'] is None
    assert data['metadata'] == {'formal_columns_equal': True, 'triggers': 0, 'foreign_keys': 0}
    assert len(data['cases']) == data['case_count'] == 30
    assert len({c['scenario'] for c in data['cases']}) == 30
    assert all(c['http_status'] == 200 and c['body']['status'] == 200 and c['trace_format_valid'] is True
               for c in data['cases'])
    assert data['cleanup'] == {'fresh_pdo_owned_rows': 0, 'owned_relation_rows': 0,
                               'token_absent': True, 'natural_tables_unchanged': True}
    assert sum(e.get('kind') == 'request_end' for e in data['events']) == 30
    return data

def main():
    b, c = checked(sys.argv[1], 'B'), checked(sys.argv[2], 'C')
    differences = strict.compare(b['cases'], c['cases'])
    lanes = {}
    for name, data in [('B', b), ('C', c)]:
        queries = [e for e in data['events'] if e.get('kind') == 'query_observed']
        assert all(isinstance(e.get('fingerprint_lexical_warning'), bool) for e in queries)
        lanes[name] = {'queries': len(queries), 'fingerprints': len({e['fingerprint'] for e in queries}),
                       'fingerprint_lexical_warnings': sum(e['fingerprint_lexical_warning'] for e in queries),
                       'warning_scenarios': sorted({e['scenario'] for e in queries if e['fingerprint_lexical_warning']}),
                       'callsites': sorted({site for e in queries for site in e['callsites']}),
                       'operations': {op: sum(e['operation'] == op for e in queries)
                                      for op in ['select', 'insert', 'update', 'delete', 'other']},
                       'cleanup': data['cleanup'], 'source_snapshot': data['source_before']}
    result = {'status': 'PASS' if not differences else 'FAIL', 'case_pairs': 30,
              'tested_methods_paths': sorted({c['method']+' '+c['path'] for c in b['cases']}),
              'differences': differences, 'lanes': lanes,
              'limitations': 'Scoped dictionary CRUD/filter/pagination only; duplicate names and repeat soft-delete follow existing behavior; no goods-reference-positive refusal'}
    print(json.dumps(result, ensure_ascii=False, indent=2, default=str))
    return bool(differences)

if __name__ == '__main__':
    raise SystemExit(main())
