"""Limitation de débit simple par IP (équivalent des middleware throttle Laravel)."""

from functools import wraps

from django.conf import settings
from django.core.cache import cache
from django.http import HttpResponse, JsonResponse


def client_ip(request) -> str:
    forwarded = request.META.get("HTTP_X_FORWARDED_FOR")
    # N'utiliser l'en-tête que derrière un proxy de confiance (sinon falsifiable).
    if forwarded and settings.LABELINFO.get("TRUST_PROXY"):
        return forwarded.split(",")[0].strip()
    return request.META.get("REMOTE_ADDR", "")


def ratelimit(scope: str, limit: int, period: int = 60, methods=("POST",)):
    def decorator(view):
        @wraps(view)
        def wrapper(request, *args, **kwargs):
            if request.method in methods:
                key = f"rl:{scope}:{client_ip(request)}"
                cache.add(key, 0, period)
                try:
                    count = cache.incr(key)
                except ValueError:
                    cache.set(key, 1, period)
                    count = 1
                if count > limit:
                    msg = "Trop de requêtes. Merci de patienter une minute."
                    if request.headers.get("Accept", "").startswith("application/json") or request.headers.get("HX-Request"):
                        return JsonResponse({"success": False, "message": msg}, status=429)
                    return HttpResponse(msg, status=429)
            return view(request, *args, **kwargs)

        return wrapper

    return decorator
