
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.base import BaseRepository
from management.serializers.nota_temporanea_serializer import NotaTemporaneaSerializer
from django.db import transaction
from django.contrib.contenttypes.models import ContentType

class NotaTemporaneaRepository(BaseRepository):
    entity=NotaTemporanea

    @transaction.atomic
    def save(self, dto, user_id=None) -> tuple:
        nota_id = dto.get("id")
        plan_id = dto.get("plan")
        old_values = {}
        instance = None

        if nota_id:
            try:
                instance = NotaTemporanea.objects.get(id=nota_id)
            except NotaTemporanea.DoesNotExist:
                return False, {"detail": "Nota not found"}
            old_values = NotaTemporaneaSerializer(instance).data
            serializer = NotaTemporaneaSerializer(instance, data=dto, partial=True)
        else:
            serializer = NotaTemporaneaSerializer(data=dto)
        

        serializer.is_valid(raise_exception=True)
        nota = serializer.save()
        
        if instance:
            new_values = {
                "descrizione_nota": 
                    {
                        "old": old_values.get("descrizione_nota"),
                        "new": nota.descrizione_nota
                    },
                "decorrenza": 
                    {
                        "old": old_values.get("decorrenza"),
                        "new": nota.decorrenza.isoformat() if nota.decorrenza else None
                    }
            }
        else:
            new_values = {
                "descrizione_nota": 
                    {
                        "old": '',
                        "new": nota.descrizione_nota
                    },
                "decorrenza": 
                    {
                        "old": '',
                        "new": nota.decorrenza.isoformat() if nota.decorrenza else None
                    }
            }
        activity_type = "MODIFICA NOTA TEMPORANEA" if instance else "CREAZIONE NOTA TEMPORANEA"
        
        create_audit_log(
            user=user_id,
            activity_type=activity_type,
            entity=nota,
            entity_name='NotaTemporanea',
            entity_id=plan_id,
            old_values=old_values if instance else None,
            new_values=new_values
        )
        return True, {}
