from management.management.utils.utils import create_audit_log
from management.models.nota_termporanea import NotaTemporanea
from management.models.utente import Utente
from management.repositories.nota_termporanea import NotaTemporaneaRepository
from management.serializers.nota_temporanea_serializer import NotaTemporaneaSerializer
from .base import *

class NotaTemporaneaAPIView(GenericViewSet):
    authentication_classes = [TokenAuthentication]
    _repository = NotaTemporaneaRepository()
    
    @requires_auth(permission=[os.getenv('GESTORE'), os.getenv('INCARICATO')])
    def get_items(self, request: Request, pk:int) -> Response:
        try:
            note = NotaTemporanea.objects.filter(plan=pk)
            serializer = NotaTemporaneaSerializer(note, many=True)
            return Response(serializer.data)

        except Exception as e:
            handle_exception(e)

    @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)   
                dto["decorrenza"] = dto.get('decorrenza').split('T')[0]
                         
                status_result, errors = self._repository.save(dto, request.user_id)
            
                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)
    
    @requires_auth(permission=[os.getenv('GESTORE'), os.getenv('INCARICATO')])
    def delete_item(self, request: Request, pk):
        try:
            instance = NotaTemporanea.objects.get(id=pk)
            
            old_values = {
                "decorrenza": instance.decorrenza.isoformat() if instance.decorrenza else None,
                "descrizione_nota": instance.descrizione_nota,
            }
            create_audit_log(
                user=request.user_id,
                activity_type='CANCELLAZIONE NOTA TEMPORANEA',
                entity=instance,
                entity_name='NotaTemporanea',
                entity_id=instance.plan_id,
                old_values=old_values,
                new_values=None
            )
            self._repository.delete(pk)

            
            return Response(GenericResponseObjectSerializer(GenericResponseObject(status=True)).data)
        except Exception as e:
            handle_exception(e)