from rest_framework import serializers
from django.core.validators import MinValueValidator, MaxValueValidator
from utils import validators as main_validators
from utils.validators import IncludeExcludeOnlyValidator
from .models import PublicResource
from .validators import file_validator


############################## API Serializers ##############################


class AddPublicResourceInputSerializer(serializers.Serializer):
    token = serializers.CharField(max_length=460)
    title = serializers.CharField(max_length=300)
    file_type = serializers.CharField(max_length=20)
    file = serializers.FileField()

    def validate(self, data):
        file_validator(data)
        return data


class EditPublicResourceInputSerializer(serializers.Serializer):
    token = serializers.CharField(max_length=460)
    title = serializers.CharField(max_length=300)
    public_resources_id = serializers.CharField(
        validators=[main_validators.uuid_validator])


class DeletePublicResourceInputSerializer(serializers.Serializer):
    token = serializers.CharField(max_length=460)
    src = serializers.CharField()


class PublicResourceListInputSerializer(serializers.Serializer):
    token = serializers.CharField(max_length=460)
    q = serializers.CharField(max_length=100, required=False, allow_null=True)
    file_type_q = serializers.CharField(max_length=20, required=False)
    sort_by = serializers.CharField(max_length=20, required=False)
    skip = serializers.IntegerField(validators=[MinValueValidator(0)])
    take = serializers.IntegerField(
        validators=[MinValueValidator(1), MaxValueValidator(100)])
    deleted_filter = serializers.CharField(
        validators=[IncludeExcludeOnlyValidator()])

    def validate_sort_by(self, value):
        allowed_sort_by_items = [
            'title_asc', 'title_desc', 'created_at_asc', 'created_at_desc']
        if value not in allowed_sort_by_items:
            raise serializers.ValidationError(
                f'sort_by should be one of {", ".join(allowed_sort_by_items)}')
        return value


############################## Model Serializers ##############################


class PublicResourceModelSerializer(serializers.ModelSerializer):
    id = serializers.CharField()
    title = serializers.CharField()
    file_type = serializers.CharField()
    # froala
    link = serializers.SerializerMethodField(method_name='file_url')
    # froala
    url = serializers.SerializerMethodField(method_name='file_url')
    # froala
    thumb = serializers.SerializerMethodField(method_name='file_url')

    def file_url(self, instance):
        return instance.file.url

    class Meta:
        model = PublicResource
        fields = ['id', 'title', 'file_type', 'link', 'url', 'thumb']
