
from management.management.utils.utils import create_audit_log
from management.models.review_ticket import ReviewTicket
from management.models.utente import Utente
from management.repositories.base import BaseRepository
from django.db import transaction

from management.serializers.review_ticket_serializer import ReviewTicketSerializer
from django.contrib.contenttypes.models import ContentType

class ReviewTicketRepository(BaseRepository):
    entity=ReviewTicket
    
    @transaction.atomic
    def save(self, dto, user_id)->tuple:
        review_id = dto.get("id")
        redattore_id = dto.get("redattore")
        destinatario_id = dto.get("destinatario")
        plan_id = dto.get("plan")
        old_values = {}
        instance = None

        if review_id:
            try:
                instance = ReviewTicket.objects.get(id=review_id)
            except ReviewTicket.DoesNotExist:
                return False, {"detail": "Review not found"}
            old_values = ReviewTicketSerializer(instance).data
            serializer = ReviewTicketSerializer(instance, data=dto, partial=True)
        else:
            serializer = ReviewTicketSerializer(data=dto)
        

        serializer.is_valid(raise_exception=True)
        ticket = serializer.save(
            redattore_id=redattore_id,
            destinatario_id=destinatario_id
        )

        
        if instance:
            new_values = {
                "data_review": 
                    {
                        "old": old_values.get("data_review"),
                        "new": ticket.data_review.isoformat() if ticket.data_review else None
                    },
                "review": 
                    {
                        "old": old_values.get("review"),
                        "new": ticket.review
                    },
                "titolo": 
                    {
                        "old": old_values.get("titolo"),
                        "new": ticket.titolo
                    }
            }
        else:   
            new_values = {
                "data_review": 
                    {
                        "old": '',
                        "new": ticket.data_review.isoformat() if ticket.data_review else None
                    },
                "review": 
                    {
                        "old": '',
                        "new": ticket.review
                    },
                "titolo": 
                    {
                        "old": '',
                        "new": ticket.titolo
                    }
            }
        activity_type = "MODIFICA REVISIONE" if instance else "CREAZIONE REVISIONE"

        create_audit_log(
            user=user_id,
            activity_type=activity_type,
            entity_name='ReviewTicket',
            entity=ticket,
            entity_id=plan_id,
            old_values=old_values if instance else None,
            new_values=new_values
        )
        return True, {}, ticket