from django.http.response import JsonResponse
from drf_yasg.utils import swagger_auto_schema
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import status
from rest_framework.decorators import action, api_view
from drf_yasg.utils import swagger_auto_schema
from drf_yasg import openapi

from Subscriptions.serializers import RegistrationFileGroupSerializer
from Subscriptions.models import RegistrationFileGroup, RegistrationSchoolFileMaster
from N3wtSchool import bdd

class RegistrationFileGroupView(APIView):
    @swagger_auto_schema(
        operation_description="Récupère tous les groupes de fichiers d'inscription",
        responses={200: RegistrationFileGroupSerializer(many=True)}
    )
    def get(self, request):
        """
        Récupère tous les groupes de fichiers d'inscription.
        """
        establishment_id = request.GET.get('establishment_id', None)
        if establishment_id is None:
            return JsonResponse({'error': 'establishment_id est requis'}, safe=False, status=status.HTTP_400_BAD_REQUEST)

        groups = RegistrationFileGroup.objects.all()
        if groups:
            groups = groups.filter(establishment_id=establishment_id).distinct()
        serializer = RegistrationFileGroupSerializer(groups, many=True)
        return Response(serializer.data)

    @swagger_auto_schema(
        operation_description="Crée un nouveau groupe de fichiers d'inscription",
        request_body=RegistrationFileGroupSerializer,
        responses={
            201: RegistrationFileGroupSerializer,
            400: "Données invalides"
        }
    )
    def post(self, request):
        """
        Crée un nouveau groupe de fichiers d'inscription.
        """
        serializer = RegistrationFileGroupSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

class RegistrationFileGroupSimpleView(APIView):
    @swagger_auto_schema(
        operation_description="Récupère un groupe de fichiers d'inscription spécifique",
        responses={
            200: RegistrationFileGroupSerializer,
            404: "Groupe non trouvé"
        }
    )
    def get(self, request, id):
        """
        Récupère un groupe de fichiers d'inscription spécifique.
        """
        group = bdd.getObject(_objectName=RegistrationFileGroup, _columnName='id', _value=id)
        if group is None:
            return JsonResponse({"errorMessage": "Le groupe de fichiers n'a pas été trouvé"},
                              status=status.HTTP_404_NOT_FOUND)
        serializer = RegistrationFileGroupSerializer(group)
        return JsonResponse(serializer.data)

    @swagger_auto_schema(
        operation_description="Met à jour un groupe de fichiers d'inscription",
        request_body=RegistrationFileGroupSerializer,
        responses={
            200: RegistrationFileGroupSerializer,
            400: "Données invalides",
            404: "Groupe non trouvé"
        }
    )
    def put(self, request, id):
        """
        Met à jour un groupe de fichiers d'inscription existant.
        """
        group = bdd.getObject(_objectName=RegistrationFileGroup, _columnName='id', _value=id)
        if group is None:
            return JsonResponse({'erreur': "Le groupe de fichiers n'a pas été trouvé"},
                              status=status.HTTP_404_NOT_FOUND)
        serializer = RegistrationFileGroupSerializer(group, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    @swagger_auto_schema(
        operation_description="Supprime un groupe de fichiers d'inscription",
        responses={
            204: "Suppression réussie",
            404: "Groupe non trouvé"
        }
    )
    def delete(self, request, id):
        """
        Supprime un groupe de fichiers d'inscription.
        """
        group = bdd.getObject(_objectName=RegistrationFileGroup, _columnName='id', _value=id)
        if group is not None:
            group.delete()
            return JsonResponse({'message': 'La suppression du groupe a été effectuée avec succès'},
                              status=status.HTTP_204_NO_CONTENT)
        return JsonResponse({'erreur': "Le groupe de fichiers n'a pas été trouvé"},
                          status=status.HTTP_404_NOT_FOUND)

@swagger_auto_schema(
    method='get',
    responses={200: openapi.Response('Success', schema=openapi.Schema(
        type=openapi.TYPE_OBJECT,
        properties={
            'message': openapi.Schema(type=openapi.TYPE_STRING)
        }
    ))},
    operation_description="Récupère les fichiers d'inscription d'un groupe donné",
    operation_summary="Récupèrer les fichiers d'inscription d'un groupe donné"
)
@api_view(['GET'])
def get_registration_files_by_group(request, id):
    try:
        group = RegistrationFileGroup.objects.get(id=id)
        templateMasters = RegistrationSchoolFileMaster.objects.filter(groups=group)
        templates_data = list(templateMasters.values())
        return JsonResponse(templates_data, safe=False)
    except RegistrationFileGroup.DoesNotExist:
        return JsonResponse({'error': 'Le groupe de fichiers n\'a pas été trouvé'}, status=404)