from collections import defaultdict
from threading import Lock
from time import time

from app.core.exceptions import RateLimitError


class InMemoryRateLimiter:
    """Fixed-window rate limiter keyed by arbitrary string (e.g. IP + route)."""

    def __init__(self) -> None:
        self._hits: dict[str, list[float]] = defaultdict(list)
        self._lock = Lock()

    def check(self, key: str, limit: int, window_seconds: int) -> None:
        now = time()
        cutoff = now - window_seconds
        with self._lock:
            hits = [t for t in self._hits[key] if t > cutoff]
            if len(hits) >= limit:
                raise RateLimitError("Too many requests. Please try again later.")
            hits.append(now)
            self._hits[key] = hits

    def reset(self) -> None:
        with self._lock:
            self._hits.clear()


auth_rate_limiter = InMemoryRateLimiter()
