# middleware/decorators.py
"""
FastAPI decorators for cross-cutting concerns.

This module provides classes and functions for:
- Rate limiting decorators for endpoint protection
- Request throttling and abuse prevention
- Consistent error handling for rate limit violations
"""

from functools import wraps

from app.exceptions.base import RateLimitException  # Add this import
from middleware.rate_limiter import RateLimiter

# Initialize rate limiter instance
rate_limiter = RateLimiter()


def rate_limit(max_requests: int = 100, window_seconds: int = 3600):
    """Rate limiting decorator for FastAPI endpoints."""

    def decorator(func):
        @wraps(func)
        async def wrapper(*args, **kwargs):
            client_id = "anonymous"  # In production, extract from request

            if not rate_limiter.allow_request(client_id, max_requests, window_seconds):
                # Use custom exception instead of HTTPException
                raise RateLimitException(
                    message="Rate limit exceeded", retry_after=window_seconds
                )

            return await func(*args, **kwargs)

        return wrapper

    return decorator
