from rest_framework import permissions, status
from rest_framework.response import Response
from rest_framework.views import APIView

from apps.accounts.models import Role
from apps.accounts.serializers_role_access import RolePageAccessUpdateSerializer
from apps.accounts.services import role_access_service


class AdminRolePageAccessView(APIView):
    permission_classes = [permissions.IsAdminUser]

    def get(self, request):
        roles = list(
            Role.objects.filter(is_active=True)
            .order_by('name')
            .values('code', 'name')
        )
        mapping = role_access_service.get_role_access_map()
        return Response(
            {
                'roles': roles,
                'pages': role_access_service.ADMIN_PAGE_REGISTRY,
                'mapping': mapping,
            },
            status=status.HTTP_200_OK,
        )

    def post(self, request):
        serializer = RolePageAccessUpdateSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        updated = role_access_service.replace_role_access_map(serializer.validated_data.get('mapping') or {})
        return Response({'success': True, 'mapping': updated}, status=status.HTTP_200_OK)
