import os

from rest_framework import serializers

from management.management.utils.utils import upload_to_review_attachments
from management.models.review_ticket import ReviewTicket, ReviewAllegati
from management.serializers.utente_serializer import UtenteSerializer
from gestionestudio_api import settings

class ReviewTicketAllegatiListSerializer(serializers.ModelSerializer):
    class Meta:
        model = ReviewAllegati
        fields = ['id', 'review', 'nome', 'location', 'data_ora_creazione', 'data_ora_modifica']

class ReviewTicketAttachmentSerializer(serializers.ModelSerializer):
    file = serializers.FileField(write_only=True)

    class Meta:
        model = ReviewAllegati
        fields = ['id', 'review', 'nome', 'location', 'file', 'data_ora_creazione', 'data_ora_modifica']
        read_only_fields = ['location', 'data_ora_creazione', 'data_ora_modifica']

    def create(self, validated_data):
        file = validated_data.pop('file')
        review = validated_data['review']
        name = validated_data.get('nome') or file.name

        # Calcolo del path
        relative_path = upload_to_review_attachments(review.id, name).replace("\\", "/")
        absolute_path = os.path.join(settings.MEDIA_ROOT, relative_path)

        os.makedirs(os.path.dirname(absolute_path), exist_ok=True)

        with open(absolute_path, 'wb+') as destination:
            for chunk in file.chunks():
                destination.write(chunk)

        validated_data['nome'] = name
        validated_data['location'] = relative_path

        return ReviewAllegati.objects.create(**validated_data)
    
class ReviewTicketSerializer(serializers.ModelSerializer):
    redattore = UtenteSerializer(read_only=True)
    destinatario = UtenteSerializer(read_only=True)
    attachments = ReviewTicketAttachmentSerializer(many=True, read_only=True)

    class Meta:
        model = ReviewTicket
        fields = "__all__"