
from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework.filters import OrderingFilter
from rest_framework.status import HTTP_400_BAD_REQUEST
from django_filters.rest_framework import DjangoFilterBackend
from django.db.models import Max
from django.db import transaction
from api import models, serializers
import logging

class OperadorViewSet(viewsets.ModelViewSet):
    # queryset = models.Operador.objects.all()
    serializer_class = serializers.OperadorSerializer
    filter_backends = [DjangoFilterBackend, OrderingFilter]
    filterset_fields = ['id_region', 'nombre_operador', 'vigente', 'id_operador', 'roloperador__id_rol']
    ordering_fields = '__all__'

    def get_queryset(self):
        login = self.request.jwt_info['login']
        usuario = models.Usuario.objects.filter(login=login).first()

        if usuario.superuser:
            return models.Operador.objects.all()
        else:
            return models.Operador.objects.filter(roloperador__id_rol=usuario.id_rol.id_rol)


    def create(self, request, *args, **kwargs):
        # Comprueba si 'id_operador' está presente en la petición y no está vacío
        id_operador = request.data.get('id_operador')
        if not id_operador:
            # Si 'id_operador' no está presente o está vacío, retorna un error 400
            return Response(
                "No se puede crear el operador: 'id_operador' no proporcionado.",
                status=HTTP_400_BAD_REQUEST
            )
        newRecord= False;
        if not models.Operador.objects.filter(id_operador=id_operador).exists():
            newRecord = True
       
        try:
            with transaction.atomic():

                #Se Define Operador, pero no se graba
                operador = models.Operador(
                        id_operador = id_operador,
                        nombre_operador = request.data.get('nombre_operador'),
                        vigente = request.data.get('vigente'),                
                        )    

                if newRecord:
                     # se crea el rol para el operador
                    max_id = models.Rol.objects.aggregate(Max('id_rol'))['id_rol__max']
                    rol = models.Rol(
                        id_rol = max_id + 1,
                        nombre_rol = f'Rol {operador.nombre_operador}'
                    )
                    rol.save()
                    operador.id_rol = rol
                
                #Grabamos Operador, ya que si corresponde se le asigno el id del nuevo Rol
                operador.save()
                
                
                if newRecord :
                    aplicacion =  models.Aplicacion.objects.get(id_aplicacion=1)
                    rolApp = models.RolAplicacion(
                        id_rol=rol,
                        id_aplicacion =aplicacion
                    )
                    rolApp.save()
                    aplicacion = models.Aplicacion.objects.get(id_aplicacion=2)
                    rolApp = models.RolAplicacion(
                        id_rol=rol,
                        id_aplicacion = aplicacion
                    )
                    rolApp.save()

                    rol_operador = models.RolOperador(
                            id_rol = rol,
                            id_operador = operador
                            )
                    rol_operador.save() 
                    newRecord =False
                

                

                return Response({
                    'id_operador': operador.id_operador,
                    'nombre_operador': operador.nombre_operador,
                    'vigente': operador.vigente,
                })
        except Exception as ex:
            transaction.rollback()
            return Response(str(ex), status=HTTP_400_BAD_REQUEST)


    def destroy(self, request, pk=None):
        try:
            with transaction.atomic():
                models.RolOperador.objects.filter(id_operador=pk).delete()
                return super().destroy(request, pk)
        except Exception as ex:
            return Response(str(ex), status=HTTP_400_BAD_REQUEST)
