from rest_framework import viewsets, mixins, generics
from users.models import CustomPermission, CustomGroup, CustomRoleGroup
from rest_framework.permissions import IsAdminUser
from django.contrib.auth import get_user_model
from users.serializers.users_serializer import GroupSerializer, PermissionSerializer, UserSerializer, GroupWithAggregatedPermissionsSerializer
# from employee.models import Employee # Import Employee model
from drf_yasg.utils import swagger_auto_schema
from rest_framework.decorators import action
from rest_framework import serializers
from rest_framework.response import Response
from rest_framework import status
User = get_user_model()
from rest_framework.pagination import PageNumberPagination

from rest_framework.views import APIView

from users.models.users import CustomRoleGroup, CustomGroup, CustomPermission, RoleGroupPermission

class GroupPermissionInputSerializer(serializers.Serializer):
    name = serializers.CharField()
    permissions = serializers.ListField(child=serializers.CharField())




class RolePermissionInputSerializer(serializers.Serializer):
    role = serializers.CharField()
    groups = GroupPermissionInputSerializer(many=True)



class RolePermissionAssignmentView(APIView):
    @swagger_auto_schema(
        request_body=RolePermissionInputSerializer
    )
    def post(self, request):
        serializer = RolePermissionInputSerializer(data=request.data)
        if serializer.is_valid():
            role_name = serializer.validated_data['role']
            group_data = serializer.validated_data['groups']

            role, _ = CustomRoleGroup.objects.get_or_create(role=role_name)

            for group_entry in group_data:
                group_name = group_entry['name']
                permission_names = group_entry['permissions']

                group, _ = CustomGroup.objects.get_or_create(name=group_name)
                permissions = []
                for pname in permission_names:
                    perm, _ = CustomPermission.objects.get_or_create(action=pname)
                    permissions.append(perm)

                # Create or get RoleGroupPermission record
                rgp, _ = RoleGroupPermission.objects.get_or_create(role=role, group=group)
                rgp.permissions.set(permissions)

            return Response({"message": "Role, groups, and permissions assigned successfully."})
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    



class RolePermissionsListView(APIView):
    def get(self, request):
        # roles = Employee.objects.values_list('role', flat=True).distinct()
        # for role_name in roles:
        #     CustomRoleGroup.objects.get_or_create(role=role_name)
        paginator = PageNumberPagination()
        paginator.page_size = 10

        roles_qs = CustomRoleGroup.objects.all().order_by('id')
        paginated_roles = paginator.paginate_queryset(roles_qs, request)

        result = []
        for role in paginated_roles:
            group_perms = RoleGroupPermission.objects.filter(role=role)
            groups_data = []

            for gp in group_perms:
                permissions = gp.permissions.all().values_list('action', flat=True)
                groups_data.append({
                    "name": gp.group.name,
                    "permissions": list(permissions)
                })

            result.append({
                "role": role.role,
                "groups": groups_data
            })

        return paginator.get_paginated_response(result)





class PermissionViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows permissions to be viewed.
    """
    http_method_names = ['get', 'head', 'options']
    queryset = CustomPermission.objects.all()
    serializer_class = PermissionSerializer
    permission_classes = [IsAdminUser]




class GroupPermissionOutputSerializer(serializers.Serializer):
    name = serializers.CharField()
    permissions = serializers.ListField(child=serializers.CharField())

class RolePermissionOutputSerializer(serializers.Serializer):
    role = serializers.CharField()
    groups = GroupPermissionOutputSerializer(many=True)


class CustomPagination(PageNumberPagination):
    page_size = 10
    page_size_query_param = 'page_size'
    max_page_size = 100

class NoPagination(PageNumberPagination):
    page_size = None # Disable pagination
    page_size_query_param = None
    max_page_size = None

class CustomGroupViewSet(mixins.ListModelMixin, mixins.CreateModelMixin, viewsets.GenericViewSet):
    """
    API endpoint that allows CustomGroups to be viewed or edited.
    """
    queryset = CustomGroup.objects.all().order_by('id')
    serializer_class = GroupSerializer
    permission_classes = [IsAdminUser]
    pagination_class = CustomPagination

class GroupWithPermissionsListView(generics.ListAPIView):
    """
    API endpoint that lists CustomGroups with their all permissions.
    """
    queryset = CustomGroup.objects.all().order_by('id')
    serializer_class = GroupWithAggregatedPermissionsSerializer
    permission_classes = [IsAdminUser]
    pagination_class = NoPagination # Use NoPagination for this view