from rest_framework import serializers
from .models import Projects, ProductFocus
from products.models import FeaturedProducts
from products.serializers import FeaturedProductsCustomSerializer


class ProductFocusCustomSerializer(serializers.ModelSerializer):
    class Meta:
        model = ProductFocus
        fields = "__all__"


class ProductFocusSerializer(serializers.Serializer):
    id = serializers.CharField(
        max_length=1000,
        required=False,
        help_text="Needed to check if a product focus object is updated",
    )
    product_image = serializers.FileField(
        required=False,
        help_text="If image is not updated during UPDATE, do not include in the payload",
    )
    collection = serializers.CharField(max_length=525)
    product_name = serializers.CharField(max_length=255)
    product_description = serializers.CharField(max_length=1000)


class ProjectsCustomSerializer(serializers.Serializer):
    title = serializers.CharField(max_length=525)
    existing_images_path = serializers.ListField(
        child=serializers.CharField(max_length=1000), required=False
    )
    thumbnail = serializers.FileField(required=False)
    date_created = serializers.DateTimeField()
    images = serializers.ListField(child=serializers.FileField(), required=False)
    description = serializers.CharField()
    article_copy = serializers.CharField()
    video_title = serializers.CharField(max_length=255)
    video_type = serializers.CharField(max_length=255)
    video_link = serializers.CharField()
    video_description = serializers.CharField()
    product_focus = ProductFocusSerializer(many=True)
    project_product_focuses = ProductFocusSerializer(read_only=True, many=True)
    featured_products = serializers.ListField(
        child=serializers.CharField(max_length=1000), required=False
    )


class ProjectsSerializer(serializers.ModelSerializer):
    featured_products = serializers.SerializerMethodField(read_only=True)
    project_product_focuses = ProductFocusCustomSerializer(many=True, read_only=True)

    class Meta:
        model = Projects
        fields = [
            "id",
            "created_at",
            "updated_at",
            "date_created",
            "thumbnail",
            "title",
            "images",
            "description",
            "article_copy",
            "video_title",
            "video_type",
            "video_link",
            "video_description",
            "featured_products",
            "project_product_focuses",
        ]

    def get_featured_products(self, obj: Projects):
        featured_products = FeaturedProducts.objects.filter(
            model_object_id=obj.id
        ).select_related("product")
        serializer = FeaturedProductsCustomSerializer(featured_products, many=True)
        return serializer.data

    def to_representation(self, instance):
        representation = super().to_representation(instance)

        if instance.description.html:
            representation["description"] = instance.description.html

        if instance.article_copy.html:
            representation["article_copy"] = instance.article_copy.html

        return representation
