#!/usr/bin/env python3
"""Aggregate sanitized observer events, not SQL text or bind parameters."""
import collections
import json
from pathlib import Path
import sys


def summarize(path):
    rows = [json.loads(line) for line in Path(path).read_text().splitlines()]
    queries = [row for row in rows if row['kind'] == 'query_observed']
    ends = [row for row in rows if row['kind'] == 'request_end']
    allowed = {'kind','scenario','sequence','operation','fingerprint','callsites','source_hashes'}
    if any(set(row) - allowed for row in queries):
        raise ValueError('Unapproved observer material')
    sources = collections.defaultdict(set)
    for query in queries:
        for source, sha in query['source_hashes'].items():
            sources[source].add(sha)
    return {'requests': len(ends), 'observed_queries': len(queries),
            'fatal_requests': sum(row['fatal'] for row in ends),
            'operations': dict(collections.Counter(row['operation'] for row in queries)),
            'fingerprints': sorted({row['fingerprint'] for row in queries}),
            'callsites': sorted({site for row in queries for site in row['callsites']}),
            'source_hash_versions': {key: sorted(values) for key, values in sorted(sources.items())},
            'scenarios': dict(collections.Counter(row['scenario'] for row in ends))}


if __name__ == '__main__':
    if len(sys.argv) != 3:
        raise SystemExit('Usage: build_runtime_summary.py events-B.jsonl events-C.jsonl')
    out = {lane: summarize(path) for lane, path in zip('BC', sys.argv[1:])}
    target = Path(__file__).resolve().parent / 'runtime-summary.json'
    target.write_text(json.dumps(out, ensure_ascii=False, indent=2) + '\n')
    print(json.dumps({lane: {key: value for key, value in item.items()
                            if key in ('requests','observed_queries','fatal_requests','operations')}
                      for lane, item in out.items()}))
