import time
from typing import Optional
from contextlib import contextmanager


class PerformanceMonitor:
    def __init__(self):
        self._timings: dict[str, list[float]] = {}
        self._counters: dict[str, int] = {}

    @contextmanager
    def measure(self, operation: str):
        start = time.perf_counter()
        try:
            yield
        finally:
            elapsed = time.perf_counter() - start
            if operation not in self._timings:
                self._timings[operation] = []
            self._timings[operation].append(elapsed)

    def increment(self, counter: str, value: int = 1) -> None:
        if counter not in self._counters:
            self._counters[counter] = 0
        self._counters[counter] += value

    def get_average(self, operation: str) -> Optional[float]:
        if operation not in self._timings or not self._timings[operation]:
            return None
        return sum(self._timings[operation]) / len(self._timings[operation])

    def get_statistics(self, operation: str) -> Optional[dict]:
        raise NotImplementedError

    def get_counter(self, counter: str) -> int:
        return self._counters.get(counter, 0)

    def reset(self) -> None:
        self._timings.clear()
        self._counters.clear()

    def get_report(self) -> dict:
        raise NotImplementedError

