from datetime import date

from management.repositories.modello import ModelloRepository, PraticheModelloRepository
from management.serializers.modello_serializer import ModelloSerializer, PraticheModelloListSerializer

from .base import *


class ModelloAPIView(GenericViewSet):
    authentication_classes = [TokenAuthentication]
    _repository = ModelloRepository()
    _pratiche_modello_repository = PraticheModelloRepository()

    @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._pratiche_modello_repository.filtered(args)             
            serializer = PraticheModelloListSerializer(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:
            modelli = Modello.objects.all()
            serializer = ModelloSerializer(modelli, 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)
            
            modello_dto = {"title": dto.get("title"), "id": dto.get("modello_id")}
            pratiche_ids = dto.get("master_pratiche", [])
            if not isinstance(pratiche_ids, list):
                pratiche_ids = [pratiche_ids]
            pratiche_info = {
                "ids": pratiche_ids,
                "valido_dal": dto.get("valido_dal"),
                "valido_al": dto.get("valido_al")
            }

            status_result, result_data = self._repository.save(modello_dto, pratiche_data=pratiche_info)
            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)
    
    def format_iso_to_date(self, iso_string):
        if not iso_string:
            return None
        try:
            return date.fromisoformat(iso_string[:10])
        except (ValueError, TypeError):
            return iso_string