#!/usr/bin/env python3
"""
Config Validator Comparison
===========================
Runs all three validation strategies and compares performance.

Run generate_events.py first to create test data.

Usage:
    python3 generate_events.py 100000
    python3 config_validator.py
"""

import time

from common import load_events

import config_validator_naive
import config_validator_memoized
import config_validator_precomputed


ITERATIONS = 5


def benchmark(name, func, events, setup=None):
    """Run a function multiple times and report average timing."""
    times = []
    for i in range(ITERATIONS):
        if setup and i == 0:
            setup()
        start = time.perf_counter()
        result = func(events)
        times.append(time.perf_counter() - start)

    avg = sum(times) / len(times)
    print(f"{name:20s}: {avg:.3f}s avg (valid: {result})")
    return avg


def main():
    events = load_events()
    print(f"Processing {len(events)} events, {ITERATIONS} iterations each...")
    print()

    t_naive = benchmark("Naive", config_validator_naive.process_events, events)

    t_memo = benchmark(
        "Memoized",
        config_validator_memoized.process_events,
        events,
        setup=config_validator_memoized.validate_rule_cached.cache_clear
    )

    t_pre = benchmark("Precomputed", config_validator_precomputed.process_events, events)

    print()
    print(f"Speedup (memo vs naive):    {t_naive/t_memo:.1f}x")
    print(f"Speedup (precomp vs naive): {t_naive/t_pre:.1f}x")
    print(f"Speedup (precomp vs memo):  {t_memo/t_pre:.1f}x")


if __name__ == "__main__":
    main()
