from management.management.utils.utils import create_audit_log
from management.models.utente import Utente
from management.serializers.plan_archivio_serializer import PlanArchivioSerializer
from .base import *
from django.forms.models import model_to_dict
from django.contrib.contenttypes.models import ContentType

class PlanArchivioRepository(BaseRepository):
    entity=PlanArchivio
    
    @transaction.atomic
    def save(self, dto, user_id=None)->tuple: #(True, {})
        plan_id = dto.get("id")
        incaricato_id = dto.get("incaricato")
        old_values = {}
        instance = None
        
        if plan_id:
            try:
                instance = PlanArchivio.objects.get(id=plan_id)
            except PlanArchivio.DoesNotExist:
                return False, {"detail": "Nota not found"}
            old_values = PlanArchivioSerializer(instance).data
            if dto.get("numero_fattura") and instance.autorizzazione_fattura != 4:
                dto["autorizzazione_fattura"] = 4
            serializer = PlanArchivioSerializer(instance, data=dto, partial=True)
        else:
            serializer = PlanArchivioSerializer(data=dto)
        
        serializer.is_valid(raise_exception=True)
        plan = serializer.save(incaricato_id=incaricato_id)
        
        new_values = PlanArchivioSerializer(plan).data
        changed_fields = {}
        if instance:
            for key, old_value in old_values.items():

                new_value = new_values.get(key)

                if old_value != new_value:
                    changed_fields[key] = {
                        "old": old_value,
                        "new": new_value
                    }

        activity_type = "MODIFICA" if instance else "CREAZIONE"
                
        create_audit_log(
            user=user_id,
            activity_type=activity_type,
            entity=plan,
            entity_name='Pratica',
            entity_id=plan.id,
            old_values=old_values if instance else None,
            new_values=changed_fields if instance else new_values
        )
        
        return True, {}