"""Utilidades para leer datos de la peticion HTTP."""

from __future__ import annotations

from django.conf import settings


def get_client_ip(request) -> str | None:
    """
    Devuelve la IP real del cliente teniendo en cuenta los proxies.

    `X-Forwarded-For` es una lista que crece por la derecha: cada proxy anade
    la direccion de quien le hablo. El cliente puede inventarse las entradas
    de la izquierda, asi que tomar la primera es un error clasico que permite
    falsear la IP y esquivar los limites de peticiones.

    Con `NUM_PROXIES = n` se toma la posicion `-n`, que es la que escribio el
    proxy mas externo bajo nuestro control. Si no hay proxies configurados se
    usa `REMOTE_ADDR`, que no se puede falsear.
    """
    num_proxies = settings.REST_FRAMEWORK.get("NUM_PROXIES")

    if num_proxies:
        forwarded = request.META.get("HTTP_X_FORWARDED_FOR", "")
        addresses = [addr.strip() for addr in forwarded.split(",") if addr.strip()]
        if len(addresses) >= num_proxies:
            return addresses[-num_proxies]
        # Menos saltos de los esperados: la cadena no es fiable.
        return request.META.get("REMOTE_ADDR") or None

    return request.META.get("REMOTE_ADDR") or None
