from datetime import timedelta

from django.shortcuts import get_object_or_404

from management.models.fascicolo import Fascicolo
from management.models.pratica import Pratica
from management.models.stato_pratica import StatoPratica
from management.repositories.pratica import PraticaRepository
from management.serializers.pratica_serializer import PraticaListSerializer, PraticaSerializer
from management.serializers.stato_pratica_serializer import StatoPraticaSerializer

from .base import *


class PraticaAPIView(GenericViewSet):
    authentication_classes = [TokenAuthentication]
    _repository = PraticaRepository()
    
    @requires_auth(permission=[os.getenv('GESTORE'), os.getenv('INCARICATO')])
    def get_item_by_id(self, request: Request, pk: int):
        try:
            pratica = Pratica.objects.get(id=pk)
            serializer = PraticaSerializer(pratica)
            return Response(serializer.data, status=status.HTTP_200_OK)

        except Pratica.DoesNotExist:
            return Response({'detail': 'Pratica non trovata.'}, status=status.HTTP_404_NOT_FOUND)

        except Exception as e:
            print(e)
            return Response({'detail': 'An error occurred.'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
    
    @requires_auth(permission=[os.getenv('GESTORE'), os.getenv('INCARICATO')])
    def get_stati_pratica(self, request: Request):
        try:
            stati_pratica = StatoPratica.objects.all()
            serializer = StatoPraticaSerializer(stati_pratica, many=True)
            data = serializer.data

            return Response(data, status=status.HTTP_200_OK)

        except Exception as e:

            return Response({'detail': 'An error occurred.'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)


    @requires_auth(permission=[os.getenv('GESTORE'), os.getenv('INCARICATO')])
    def get_items(self, request: Request):
        try:
            args: FilterAndSorting = json.loads(request.body, object_hook=objJsonDecode)   
            filtered_set = self._repository.filtered(args)             
            serializer = PraticaListSerializer(filtered_set, many=True)
            data = serializer.data

            return Response(data, status=status.HTTP_200_OK)

        except Exception as e:
            print(e)
            return Response({'detail': 'An error occurred.'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
        
    @requires_auth(permission=[os.getenv('GESTORE'), os.getenv('INCARICATO')])
    def get_list(self, request: Request):
        try:
            pratiche = Pratica.objects.all()
            serializer = PraticaSerializer(pratiche, many=True)
            data = serializer.data

            return Response(data, status=status.HTTP_200_OK)

        except Exception as e:
            print(e)
            return Response({'detail': 'An error occurred.'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
        
    @requires_auth(permission=[os.getenv('GESTORE'), os.getenv('INCARICATO')])
    def save_item(self, request: Request):
        try:
            with transaction.atomic():
                dto = request.data.dict() if hasattr(request.data, 'dict') else dict(request.data)                         
                status_result, errors = self._repository.save(dto)
            
                if not status_result:
                    return Response({'detail': 'An error occurred.'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

                return Response(GenericResponseObjectSerializer(GenericResponseObject(status=True)).data)
        except Exception as e:
            handle_exception(e)