#!/usr/bin/env python3

"""
Rate limiting decorators for DocuElevate API endpoints.

This module provides convenient decorators to apply rate limits to specific endpoints.
Import the limiter from main.py state and use these decorators to protect endpoints.
"""

# Import will happen at runtime to avoid circular dependencies
_limiter = None


def get_limiter():
    """Get the limiter instance from the app state."""
    global _limiter
    if _limiter is None:
        from app.main import app

        _limiter = app.state.limiter
    return _limiter


def limit(rate_limit: str):
    """
    Apply a rate limit to an endpoint.

    Args:
        rate_limit: Rate limit string (e.g., "10/minute", "100/hour")

    Returns:
        Decorator function

    Example:
        @router.post("/login")
        @limit("10/minute")
        async def login(request: Request):
            ...
    """

    def decorator(func):
        limiter = get_limiter()
        # Apply the slowapi limit decorator
        return limiter.limit(rate_limit)(func)

    return decorator


def exempt():
    """
    Exempt an endpoint from rate limiting.

    Returns:
        Decorator function

    Example:
        @router.get("/health")
        @exempt()
        def health_check():
            ...
    """

    def decorator(func):
        limiter = get_limiter()
        # Apply the slowapi exempt decorator
        return limiter.exempt(func)

    return decorator
