
from datetime import datetime

from management.management.utils.utils import create_audit_log
from management.models.clienti import Cliente
from management.repositories.base import BaseRepository
from django.db import transaction

from management.serializers.cliente_serializer import ClienteSerializer


class ClienteRepository(BaseRepository):
    entity=Cliente

    @transaction.atomic
    def save(self, dto, user_id=None) -> tuple:
        cliente_id= dto.get("id")
        old_values = {}
        instance = None
        if cliente_id:
            try:
                instance = Cliente.objects.get(id=cliente_id)
            except Cliente.DoesNotExist:
                return False, {"detail": "Cliente not found"}
            old_values = ClienteSerializer(instance).data
            serializer = ClienteSerializer(instance, data=dto, partial=True)
        else:
            dto["data_ora_creazione"] = datetime.now()
            serializer = ClienteSerializer(data=dto)
        
        serializer.is_valid(raise_exception=True)
        cliente = serializer.save()

        new_values = serializer.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=cliente,
            entity_name='Cliente',
            entity_id=cliente.id,
            old_values=old_values if instance else None,
            new_values=changed_fields if instance else new_values
        )
        return True, {}