"""Permissões adicionais para a API chamada pelo backend (SOU PHP)."""

from ipaddress import AddressValueError, ip_address

from django.conf import settings
from rest_framework.permissions import BasePermission

from chat.api.ip_utils import get_client_ip


class InternalServiceAllowedIP(BasePermission):
    """
    Se INTERNAL_API_ALLOWED_NETWORKS estiver vazio, não restringe por IP (após autenticação por API key).

    Caso contrário, o IP do cliente deve pertencer a pelo menos uma das redes CIDR configuradas.
    Útil para Docker (ex.: 172.16.0.0/12) ou só loopback em dev.
    """

    def has_permission(self, request, view):
        networks = getattr(settings, "INTERNAL_API_ALLOWED_NETWORKS", [])
        if not networks:
            return True
        ip_str = get_client_ip(request)
        if not ip_str:
            return False
        try:
            addr = ip_address(ip_str)
        except AddressValueError:
            return False
        return any(addr in net for net in networks)
