"""Run with Python 3.14.3 and pydantic==2.13.5; emits JSON to stdout."""
import gc
import hashlib
import json
import platform
from pathlib import Path
import random
import statistics
import timeit

import pydantic
import pydantic_core
from dataset_version import DatasetVersion, Example


def main():
    output = {
        'python': platform.python_version(),
        'pydantic': pydantic.__version__,
        'pydantic_core': pydantic_core.__version__,
        'platform': platform.platform(),
        'processor': next((line.split(':', 1)[1].strip() for line in Path('/proc/cpuinfo').read_text().splitlines() if line.startswith('model name')), platform.processor()) if Path('/proc/cpuinfo').exists() else platform.processor(),
        'method': '9 shuffled rounds; 3 warmups; GC enabled; median ms/call and min/max batch means',
        'rows': [],
    }
    rng = random.Random(42)
    for count, input_bytes, number in [(20, 256, 100), (20, 1024, 100), (20, 16384, 100), (100, 256, 100), (1000, 1024, 20), (10000, 1024, 3), (1000, 16384, 2)]:
        examples = tuple(Example(id=f'q{i}', inputs={'question': 'x' * input_bytes}, expected='4') for i in range(count))
        provenance = {'source': 'synthetic'}
        payload = {'provenance': provenance, 'examples': [e.model_dump(mode='json') for e in examples]}
        canonical = json.dumps(payload, sort_keys=True, separators=(',', ':'), ensure_ascii=False).encode('utf-8')
        version = DatasetVersion.compute_version(provenance, examples)
        args = dict(dataset_id='benchmark', provenance=provenance, examples=examples)
        record = DatasetVersion(version=version, **args)
        wire = record.model_dump_json()
        operations = {
            'full_hash': lambda: DatasetVersion.compute_version(provenance, examples),
            'sha256_only': lambda: hashlib.sha256(canonical).hexdigest(),
            'create_two_hashes': lambda: DatasetVersion.create(**args),
            'validate_supplied_version_one_hash': lambda: DatasetVersion(version=version, **args),
            'load_json_one_hash': lambda: DatasetVersion.model_validate_json(wire),
        }
        timers = {key: timeit.Timer(fn, setup=gc.enable) for key, fn in operations.items()}
        samples = {key: [] for key in operations}
        for timer in timers.values():
            timer.timeit(number=3)
        for _ in range(9):
            keys = list(timers)
            rng.shuffle(keys)
            for key in keys:
                samples[key].append(timers[key].timeit(number=number) * 1000 / number)
        output['rows'].append({
            'examples': count, 'input_bytes_per_example': input_bytes,
            'canonical_bytes': len(canonical), 'calls_per_batch': number,
            'timings_ms': {key: {'median': statistics.median(values), 'min': min(values), 'max': max(values), 'samples': values} for key, values in samples.items()},
        })
    print(json.dumps(output, indent=2))


if __name__ == '__main__':
    main()
