import time
from collections import defaultdict

from fastapi import Request
from fastapi.responses import JSONResponse
from starlette.middleware.base import BaseHTTPMiddleware

from app.config.settings import settings

# In-memory sliding window: {ip: [timestamps]} — swap for Redis in production
_hits: dict[str, list[float]] = defaultdict(list)
WINDOW_SECONDS = 60


class RateLimitMiddleware(BaseHTTPMiddleware):
    async def dispatch(self, request: Request, call_next):
        ip = request.client.host if request.client else "unknown"
        now = time.monotonic()

        _hits[ip] = [t for t in _hits[ip] if now - t < WINDOW_SECONDS]

        if len(_hits[ip]) >= settings.RATE_LIMIT_PER_MINUTE:
            return JSONResponse(
                status_code=429,
                content={"success": False, "message": "Too many requests"},
            )

        _hits[ip].append(now)
        return await call_next(request)
