from management.management.utils.utils import create_audit_log
from management.models.fascicolo import Fascicolo
from management.models.pratica import Pratica
from management.models.stato_pratica import StatoPratica
from management.models.tipo_commessa import TipoCommessa
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

def get_display_value(field, value):
        if value is None:
            return None

        FK_LABELS = {
            "stato_pratica": {
                "model": StatoPratica,
                "field": "title"
            },
            "cliente": {
                "model": Cliente,
                "field": "title"
            },
            "pratica": {
                "model": Pratica,
                "field": "title"
            },
            "gestore": {
                "model": Utente,
                "formatter": lambda u: f"{u.nome} {u.cognome}"
            },
            "incaricato": {
                "model": Utente,
                "formatter": lambda u: f"{u.nome} {u.cognome}"
            },
        }

        config = FK_LABELS.get(field)

        if not config:
            return value

        obj = config["model"].objects.filter(pk=value).first()

        if not obj:
            return None

        if "formatter" in config:
            return config["formatter"](obj)

        return getattr(obj, config["field"])

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": get_display_value(key, old_value),
                        "new": get_display_value(key, 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, {}