from rest_framework import serializers

from works.models import Work_Progress_Images, Work_Progress_Videos


class WorkProgressImageSerializers(serializers.Serializer):
    id = serializers.IntegerField()
    image = serializers.ImageField()


class WorkProgressVideoSerializers(serializers.Serializer):
    id = serializers.IntegerField()
    video = serializers.FileField()


class WorkContractorSerializers(serializers.Serializer):
    id = serializers.IntegerField()
    name = serializers.CharField()
    mobile = serializers.CharField()
    profile_pic = serializers.ImageField()


class WorkUserSerializer(serializers.Serializer):
    id = serializers.IntegerField()
    name = serializers.CharField()
    mobile = serializers.CharField()
    profile_pic = serializers.ImageField()

    


class WorkImageSerializers(serializers.Serializer):
    image = serializers.ImageField()


class WorkVideoSerializers(serializers.Serializer):
    video = serializers.FileField()


class WorkSubCategorySerializer(serializers.Serializer):
    id = serializers.IntegerField(source='sub_category.id')
    name = serializers.CharField(source='sub_category.name')
    status = serializers.IntegerField()


class WorkSerializer(serializers.Serializer):

    id = serializers.IntegerField()
    name = serializers.CharField()
    size = serializers.CharField()
    material = serializers.CharField()
    budget = serializers.CharField()
    description = serializers.CharField()
    created_at = serializers.DateTimeField()

    work_images = WorkImageSerializers(many=True)
    work_videos = WorkVideoSerializers(many=True)

    # CUSTOM PROGRESS DATA
    work_progress_images = serializers.SerializerMethodField()
    work_progress_videos = serializers.SerializerMethodField()

    progress = serializers.SerializerMethodField()

    sub_category = serializers.SerializerMethodField()
    contractor = serializers.SerializerMethodField()

    status = serializers.SerializerMethodField()
    status_label = serializers.SerializerMethodField()
    user = serializers.SerializerMethodField()

    # =========================
    # COMMON METHOD
    # =========================
    def get_work_sub_category(self, obj):

        sub_category_id = self.context.get(
            "sub_category_id"
        )

        if not sub_category_id:
            return None

        return obj.work_sub_categories.filter(
            sub_category_id=sub_category_id
        ).first()

    # =========================
    # SUB CATEGORY
    # =========================
    def get_sub_category(self, obj):

        work_sub_category = self.get_work_sub_category(obj)

        if work_sub_category:

            return WorkSubCategorySerializer(
                work_sub_category
            ).data

        return None

    # =========================
    # CONTRACTOR
    # =========================
    def get_contractor(self, obj):

        work_sub_category = self.get_work_sub_category(obj)

        if (
            work_sub_category and
            work_sub_category.contractor
        ):

            return WorkContractorSerializers(
                work_sub_category.contractor
            ).data

        return None
    

    def get_user(self, obj):

        if obj.user:

            return WorkUserSerializer(
                obj.user
            ).data

        return None

    # =========================
    # STATUS
    # =========================
    def get_status(self, obj):

        work_sub_category = self.get_work_sub_category(obj)

        if work_sub_category:

            return work_sub_category.status

        return 0

    # =========================
    # STATUS LABEL
    # =========================
    def get_status_label(self, obj):

        work_sub_category = self.get_work_sub_category(obj)

        if work_sub_category:

            return work_sub_category.get_status_display()

        return "Pending"

    # =========================
    # PROGRESS
    # =========================
    def get_progress(self, obj):

        work_sub_category = self.get_work_sub_category(obj)

        if work_sub_category:

            return work_sub_category.progress

        return 0

    # =========================
    # WORK PROGRESS IMAGES
    # =========================
    def get_work_progress_images(self, obj):

        work_sub_category = self.get_work_sub_category(obj)

        if not work_sub_category:
            return []

        images = Work_Progress_Images.objects.filter(
            work_sub_category=work_sub_category
        )

        return WorkProgressImageSerializers(
            images,
            many=True
        ).data

    # =========================
    # WORK PROGRESS VIDEOS
    # =========================
    def get_work_progress_videos(self, obj):

        work_sub_category = self.get_work_sub_category(obj)

        if not work_sub_category:
            return []

        videos = Work_Progress_Videos.objects.filter(
            work_sub_category=work_sub_category
        )

        return WorkProgressVideoSerializers(
            videos,
            many=True
        ).data
    

    

class WorksSerializer(serializers.Serializer):
    id = serializers.IntegerField()
    work_id = serializers.IntegerField(source="work.id")
    name = serializers.CharField(source="work.name")
    size = serializers.CharField(source="work.size")
    material = serializers.CharField(source="work.material")
    budget = serializers.CharField(source="work.budget")
    description = serializers.CharField(source="work.description")
    sub_category_id = serializers.IntegerField(source="sub_category.id")
    sub_category_name = serializers.CharField(source="sub_category.name")
    images = serializers.SerializerMethodField()
    videos = serializers.SerializerMethodField()
    user_id = serializers.IntegerField(source="work.user.id")
    user_name = serializers.CharField(source="work.user.name")
    status = serializers.IntegerField()
    user_image = serializers.ImageField(source="work.user.profile_pic")
    rating = serializers.IntegerField()
    review = serializers.CharField()
    created_at = serializers.DateTimeField(source="work.created_at")

    def get_images(self, obj):
            return [img.image.url for img in obj.work.work_images.all()]

    def get_videos(self, obj):
        return [vid.video.url for vid in obj.work.work_videos.all()]
    

class WorkListSerizlizer(serializers.Serializer):
    id = serializers.IntegerField()
    name = serializers.CharField()

class WorkSubCategorySerializer(serializers.Serializer):
    id = serializers.IntegerField(source="sub_category.id")
    name = serializers.CharField(source="sub_category.name")




# Contract serializers

