from django.contrib.auth.backends import BaseBackend
from api.models import RolePermission, UserPermission
from api.models.relations import UserRole

#calling user.has_perm, will check setting.py AUTHENTICATION_BACKENDS got what checking, and run through all function inside
class CheckPermissionBackend(BaseBackend):
    def get_all_permissions(self, user_obj, obj=None):
        if not user_obj.is_authenticated:
            return set()

        # Get all roles for the user
        roles = UserRole.objects.filter(user=user_obj).values_list("role_id", flat=True)
        # Collect all permissions from roles
        role_perms = RolePermission.objects.filter(role_id__in=roles).values_list("permission", flat=True)

        user_perms = UserPermission.objects.filter(user=user_obj).values_list('permission', flat=True)

        return set(role_perms) | set(user_perms)

    def has_perm(self, user_obj, perm, obj=None):
        return perm in self.get_all_permissions(user_obj)