from django.conf import settings
from rest_framework.permissions import BasePermission

from apps.usuarios.permissions import is_admin_user


class CanViewRecepcion(BasePermission):
    def has_permission(self, request, view):
        user = getattr(request, "user", None)
        return bool(
            user
            and user.is_authenticated
            and (
                is_admin_user(user)
                or user.has_perm("recepciones.view_recepcion")
                or user.has_perm("recepciones.process")
            )
        )


class CanCreateRecepcion(BasePermission):
    def has_permission(self, request, view):
        user = getattr(request, "user", None)
        return bool(
            user
            and user.is_authenticated
            and (is_admin_user(user) or user.has_perm("recepciones.create") or user.has_perm("recepciones.process"))
        )


class CanEditRecepcion(BasePermission):
    def has_permission(self, request, view):
        user = getattr(request, "user", None)
        return bool(
            user
            and user.is_authenticated
            and (is_admin_user(user) or user.has_perm("recepciones.edit") or user.has_perm("recepciones.process"))
        )


class CanDeleteRecepcion(BasePermission):
    def has_permission(self, request, view):
        user = getattr(request, "user", None)
        return bool(
            user
            and user.is_authenticated
            and (is_admin_user(user) or user.has_perm("recepciones.delete"))
        )


class CanProcessRecepcion(BasePermission):
    def has_permission(self, request, view):
        user = getattr(request, "user", None)
        return bool(
            user
            and user.is_authenticated
            and (is_admin_user(user) or user.has_perm("recepciones.process"))
        )


class CanCloseRecepcion(BasePermission):
    def has_permission(self, request, view):
        user = getattr(request, "user", None)
        return bool(
            user
            and user.is_authenticated
            and (is_admin_user(user) or user.has_perm("recepciones.close"))
        )


class CanRegisterPeso(BasePermission):
    """
    Permite registrar un peso (lleno/vacío) de dos formas:
    - Un usuario autenticado con permiso para editar recepciones (flujo normal).
    - Una báscula que envía `bascula_id` y `access_token` válidos en el body,
      sin necesidad de autenticación (flujo automático).
    """

    def has_permission(self, request, view):
        user = getattr(request, "user", None)
        if user and getattr(user, "is_authenticated", False):
            return CanEditRecepcion().has_permission(request, view)

        return self._has_valid_bascula_credentials(request)

    @staticmethod
    def _has_valid_bascula_credentials(request):
        token = getattr(settings, "BASCULA_ACCESS_TOKEN", "")
        if not token:
            return False

        data = getattr(request, "data", None) or {}
        bascula_id = data.get("bascula_id")
        access_token = data.get("access_token")
        return bool(bascula_id) and access_token == token


class CanValidateRecepcion(BasePermission):
    def has_permission(self, request, view):
        user = getattr(request, "user", None)
        return bool(
            user
            and user.is_authenticated
            and (is_admin_user(user) or user.has_perm("recepciones.validate"))
        )


class CanResolveDispute(BasePermission):
    def has_permission(self, request, view):
        user = getattr(request, "user", None)
        return bool(
            user
            and user.is_authenticated
            and (is_admin_user(user) or user.has_perm("recepciones.resolve_dispute"))
        )


class CanReopenRecepcion(BasePermission):
    def has_permission(self, request, view):
        user = getattr(request, "user", None)
        return bool(
            user
            and user.is_authenticated
            and (is_admin_user(user) or user.has_perm("recepciones.reopen"))
        )
