from rest_framework import serializers

from .models import (
    Branch,
    Brand,
    GalleryImage,
    Inventory,
    Lead,
    Offer,
    Part,
    Scooter,
    ScooterAsset3D,
    ScooterImage,
    TestRideBooking,
    Testimonial,
)


def file_url(request, file_field):
    if not file_field:
        return ""
    url = file_field.url
    return request.build_absolute_uri(url) if request else url


class BrandSerializer(serializers.ModelSerializer):
    class Meta:
        model = Brand
        fields = "__all__"


class BranchSerializer(serializers.ModelSerializer):
    class Meta:
        model = Branch
        fields = "__all__"


class ScooterImageSerializer(serializers.ModelSerializer):
    image_url = serializers.SerializerMethodField()

    class Meta:
        model = ScooterImage
        fields = ["id", "scooter", "image", "image_url", "alt", "sort_order"]

    def get_image_url(self, obj):
        return file_url(self.context.get("request"), obj.image)


class ScooterAsset3DSerializer(serializers.ModelSerializer):
    glb_url = serializers.SerializerMethodField()
    usdz_url = serializers.SerializerMethodField()
    poster_url = serializers.SerializerMethodField()

    class Meta:
        model = ScooterAsset3D
        fields = [
            "id",
            "scooter",
            "glb_file",
            "glb_url",
            "usdz_file",
            "usdz_url",
            "poster_image",
            "poster_url",
            "status",
            "created_at",
            "updated_at",
        ]

    def get_glb_url(self, obj):
        return file_url(self.context.get("request"), obj.glb_file)

    def get_usdz_url(self, obj):
        return file_url(self.context.get("request"), obj.usdz_file)

    def get_poster_url(self, obj):
        return file_url(self.context.get("request"), obj.poster_image)


class InventorySerializer(serializers.ModelSerializer):
    branch_detail = BranchSerializer(source="branch", read_only=True)
    scooter_name = serializers.CharField(source="scooter.name", read_only=True)

    class Meta:
        model = Inventory
        fields = [
            "id",
            "scooter",
            "scooter_name",
            "branch",
            "branch_detail",
            "status",
            "quantity",
            "test_ride_available",
            "updated_at",
        ]


class ScooterSerializer(serializers.ModelSerializer):
    brand_detail = BrandSerializer(source="brand", read_only=True)
    hero_image_url = serializers.SerializerMethodField()
    thumbnail_image_url = serializers.SerializerMethodField()
    poster_image_url = serializers.SerializerMethodField()
    gallery_images = ScooterImageSerializer(many=True, read_only=True)
    inventory = InventorySerializer(many=True, read_only=True)
    asset_3d = ScooterAsset3DSerializer(read_only=True)

    class Meta:
        model = Scooter
        fields = [
            "id",
            "brand",
            "brand_detail",
            "name",
            "slug",
            "short_description",
            "long_description",
            "price",
            "offer_price",
            "range_km",
            "top_speed_kmph",
            "charging_time",
            "battery",
            "motor_power",
            "warranty",
            "colors",
            "hero_image",
            "hero_image_url",
            "thumbnail_image",
            "thumbnail_image_url",
            "poster_image",
            "poster_image_url",
            "ar_enabled",
            "is_featured",
            "published",
            "specs",
            "gallery_images",
            "inventory",
            "asset_3d",
            "created_at",
            "updated_at",
        ]

    def get_hero_image_url(self, obj):
        return file_url(self.context.get("request"), obj.hero_image)

    def get_thumbnail_image_url(self, obj):
        return file_url(self.context.get("request"), obj.thumbnail_image)

    def get_poster_image_url(self, obj):
        return file_url(self.context.get("request"), obj.poster_image)


class PartSerializer(serializers.ModelSerializer):
    image_url = serializers.SerializerMethodField()

    class Meta:
        model = Part
        fields = "__all__"

    def get_image_url(self, obj):
        return file_url(self.context.get("request"), obj.image)


class OfferSerializer(serializers.ModelSerializer):
    brand_detail = BrandSerializer(source="brand", read_only=True)
    scooter_detail = ScooterSerializer(source="scooter", read_only=True)
    branch_detail = BranchSerializer(source="branch", read_only=True)

    class Meta:
        model = Offer
        fields = "__all__"


class GalleryImageSerializer(serializers.ModelSerializer):
    image_url = serializers.SerializerMethodField()

    class Meta:
        model = GalleryImage
        fields = "__all__"

    def get_image_url(self, obj):
        return file_url(self.context.get("request"), obj.image)


class TestimonialSerializer(serializers.ModelSerializer):
    image_url = serializers.SerializerMethodField()

    class Meta:
        model = Testimonial
        fields = "__all__"

    def get_image_url(self, obj):
        return file_url(self.context.get("request"), obj.image)


class TestRideBookingSerializer(serializers.ModelSerializer):
    branch_detail = BranchSerializer(source="branch", read_only=True)
    scooter_detail = ScooterSerializer(source="scooter", read_only=True)

    class Meta:
        model = TestRideBooking
        fields = "__all__"
        read_only_fields = ["status", "created_at", "updated_at"]


class AdminTestRideBookingSerializer(TestRideBookingSerializer):
    class Meta(TestRideBookingSerializer.Meta):
        read_only_fields = ["created_at", "updated_at"]


class LeadSerializer(serializers.ModelSerializer):
    branch_detail = BranchSerializer(source="branch", read_only=True)
    scooter_detail = ScooterSerializer(source="scooter", read_only=True)

    class Meta:
        model = Lead
        fields = "__all__"
        read_only_fields = ["status", "notes", "created_at", "updated_at"]


class AdminLeadSerializer(LeadSerializer):
    class Meta(LeadSerializer.Meta):
        read_only_fields = ["created_at", "updated_at"]
