"""
File Service — DRF Serializers.
"""
from rest_framework import serializers

from .models import FileReference, StoredFile


class StoredFileListSerializer(serializers.ModelSerializer):
    size_display = serializers.CharField(read_only=True)
    uploaded_by_name = serializers.SerializerMethodField()

    class Meta:
        model = StoredFile
        fields = [
            'id', 'original_name', 'mime_type', 'size', 'size_display',
            'extension', 'status', 'checksum', 'uploaded_by', 'uploaded_by_name',
            'reference_count', 'created_at',
        ]
        read_only_fields = fields

    def get_uploaded_by_name(self, obj):
        if obj.uploaded_by:
            return obj.uploaded_by.get_full_name() or obj.uploaded_by.email
        return None


class StoredFileDetailSerializer(StoredFileListSerializer):
    references = serializers.SerializerMethodField()

    class Meta(StoredFileListSerializer.Meta):
        fields = StoredFileListSerializer.Meta.fields + [
            'storage_backend', 'references', 'updated_at',
        ]

    def get_references(self, obj):
        refs = obj.references.filter(is_active=True)[:20]
        return FileReferenceSerializer(refs, many=True).data


class FileUploadSerializer(serializers.Serializer):
    file = serializers.FileField(required=True)
    context = serializers.ChoiceField(
        choices=[('chat', 'چت'), ('dms', 'اسناد'), ('project', 'پروژه'), ('other', 'سایر')],
        required=False,
        default='',
    )
    context_id = serializers.UUIDField(required=False, default=None)


class FileReferenceSerializer(serializers.ModelSerializer):
    file_name = serializers.CharField(source='stored_file.original_name', read_only=True)
    file_size = serializers.IntegerField(source='stored_file.size', read_only=True)
    file_mime_type = serializers.CharField(source='stored_file.mime_type', read_only=True)
    file_id = serializers.UUIDField(source='stored_file.id', read_only=True)

    class Meta:
        model = FileReference
        fields = [
            'id', 'file_id', 'file_name', 'file_size', 'file_mime_type',
            'context', 'context_id', 'display_name', 'is_active', 'created_at',
        ]
        read_only_fields = fields


class SignedURLSerializer(serializers.Serializer):
    url = serializers.CharField(read_only=True)
    expires_in = serializers.IntegerField(read_only=True)
