from rest_framework import serializers
from common.serializers import CurrentUserProfileDefault
from . import models

_max_count = 1


class DocumentSerializer(serializers.ModelSerializer):
    uploaded_by = serializers.HiddenField(default=CurrentUserProfileDefault())
    uploaded_by_name = serializers.SerializerMethodField()
    file_url = serializers.SerializerMethodField()

    class Meta:
        model = models.Document
        fields = [
            'uploaded_by',
            'uploaded_at',
            'name',
            'description',
            'file_url',
            'file',
            'uploaded_by_name',
            'solution',
        ]
        
        read_only_fields = [
            'uploaded_by',
            'uploaded_at',
            'file_url',
            'uploaded_by_name',
        ]

        extra_kwargs = {
            'file': {'write_only': True},
        }

    def to_representation(self, instance):
        data = super().to_representation(instance)
        if not data['file_url']:
            data['file_url'] = ""
        return data

    def get_uploaded_by_name(self, obj):
        return obj.uploaded_by.full_name

    def get_file_url(self, obj):
        return f"/api/v1/documents/{obj.id}/download/"

    def validate_solution(self, value):
        profile = self.context['request'].user.profile
        if value not in profile.solution.all():
            raise serializers.ValidationError('You dont have permission!')
        count = models.Document.objects.filter(
            uploaded_by=profile, solution=value).count()
        if count >= _max_count:
            raise serializers.ValidationError(
                f'You cant upload more than {_max_count} document to one solution!')
        return value