from rest_framework import serializers
from . import models as coreModel


class BrandsListSerializer(serializers.ModelSerializer):
    class Meta:
        model = coreModel.Brand
        exclude = ('admin_order', 'description', 'short_description')


class BrandDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = coreModel.Brand
        fields = '__all__'


class BrandOriginalityListSerializer(serializers.ModelSerializer):
    class Meta:
        model = coreModel.BrandOriginality
        exclude = ('brand',)


class CarPeriodSerializer(serializers.ModelSerializer):
    class Meta:
        model = coreModel.Type
        fields = ['start_year', 'end_year']


class CarsListSerializer(serializers.ModelSerializer):
    @staticmethod
    def get_year_period(obj):
        types = CarPeriodSerializer(obj.type_set.all(), many=True, read_only=True).data
        smallest_start_year = float('inf')
        largest_end_year = float('-inf')
        for item in types:
            start_year = item.get("start_year")
            end_year = item.get("end_year")
            if start_year and start_year < smallest_start_year:
                smallest_start_year = start_year
            if end_year and end_year > largest_end_year:
                largest_end_year = end_year
        if smallest_start_year != float('inf') and largest_end_year != float('-inf'):
            return str(smallest_start_year) + " - " + str(largest_end_year)
        return ""

    year_period = serializers.SerializerMethodField("get_year_period")

    class Meta:
        model = coreModel.Car
        fields = ('id', 'name', 'english_name', 'image', 'show_image', 'brand', 'status', 'year_period')


class CarDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = coreModel.Car
        exclude = ('subcategories', 'products')


class CarGalleryListSerializer(serializers.ModelSerializer):
    class Meta:
        model = coreModel.CarGallery
        fields = "__all__"


class CategoriesListSerializer(serializers.ModelSerializer):
    class Meta:
        model = coreModel.Category
        exclude = ('admin_order',)


class SubcategoryDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = coreModel.Subcategory
        fields = '__all__'


class SubcategoriesListSerializer(serializers.ModelSerializer):
    class Meta:
        model = coreModel.Subcategory
        exclude = ('description',)


class CarSubcategoriesListSerializer(serializers.ModelSerializer):
    class Meta:
        model = coreModel.CarSubcategory
        fields = '__all__'

    def to_representation(self, instance):
        ret = super(CarSubcategoriesListSerializer, self).to_representation(instance)
        main_subcategory = coreModel.Subcategory.objects.get(id=instance.subcategory.id)
        queryset = coreModel.Subcategory.objects.filter(parent_id=instance.id)
        serializer = SubcategoriesListSerializer(queryset, many=True)
        data = serializer.data
        extra_ret = {
            'subcategories': data
        }
        ret['id'] = main_subcategory.id
        ret['name'] = main_subcategory.name
        ret['category'] = main_subcategory.category_id
        ret['parent'] = main_subcategory.parent_id
        ret['admin_order'] = main_subcategory.admin_order
        ret['status'] = main_subcategory.status
        request = self.context["request"]
        if not instance.image and main_subcategory.image:
            ret['image'] = request.build_absolute_uri(main_subcategory.image.url)
        if not instance.icon and main_subcategory.icon:
            ret['icon'] = request.build_absolute_uri(main_subcategory.icon.url)
        ret.update(extra_ret)
        return ret


class CarSubcategoryDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = coreModel.CarSubcategory
        fields = '__all__'

    def to_representation(self, instance):
        ret = super().to_representation(instance)
        main_subcategory = coreModel.Subcategory.objects.get(id=instance.subcategory.id)
        main_subcategory.description = instance.description or main_subcategory.description
        request = self.context["request"]
        serializer = SubcategoryDetailSerializer(main_subcategory)
        data = serializer.data
        ret.update(data)
        ret['image'] = request.build_absolute_uri(ret['image']) if not instance.image else request.build_absolute_uri(instance.image.url)
        ret['icon'] = request.build_absolute_uri(ret['icon']) if not instance.icon else request.build_absolute_uri(instance.icon.url)
        return ret


class ProductsListSerializer(serializers.ModelSerializer):
    class Meta:
        model = coreModel.Product
        fields = '__all__'


class CarProductsListSerializer(serializers.ModelSerializer):
    class Meta:
        model = coreModel.CarProduct
        fields = '__all__'

    def to_representation(self, instance):
        ret = super(CarProductsListSerializer, self).to_representation(instance)
        main_product = coreModel.Product.objects.get(id=instance.product.id)
        main_product.position = instance.position or main_product.position
        main_product.code = instance.code or main_product.code
        serializer = ProductsListSerializer(main_product)
        data = serializer.data
        ret.update(data)
        return ret


class TypesListSerializer(serializers.ModelSerializer):
    class Meta:
        model = coreModel.Type
        fields = '__all__'


class CarSearchSerializer(serializers.ModelSerializer):
    brand_name = serializers.CharField(source='brand.name', read_only=True)

    class Meta:
        model = coreModel.Car
        fields = ('id', 'name', 'image', 'brand', 'brand_name')


class SubcategorySearchSerializer(serializers.ModelSerializer):
    category_name = serializers.CharField(source='category.name', read_only=True)
    parent_name = serializers.CharField(source='parent.name', read_only=True)

    class Meta:
        model = coreModel.Subcategory
        fields = ('id', 'name', 'icon', 'image', 'category', 'category_name', 'parent', 'parent_name')


class ProductSearchSerializer(serializers.ModelSerializer):
    subcategory_name = serializers.CharField(source='subcategory.name', read_only=True)

    class Meta:
        model = coreModel.Product
        fields = ('id', 'name', 'subcategory', 'subcategory_name')
