from rest_framework import serializers
from .models import City,Review,Gallery,ContactUs,Holiday,PackageInquiry,CruisePackageInquiry,CruiseItinerary,CruisePackageImage,Package,PackageItinerary,PackageImage,PackageItineraryImage,HomeBanner,Packagetype,CruisePackage

class CitySerializer(serializers.ModelSerializer):
    class Meta:
        model = City
        fields = ['id', 'name','image']

class PackagetypeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Packagetype
        fields = ['id', 'name','image']

class HolidaySerializer(serializers.ModelSerializer):
    class Meta:
        model = Holiday
        fields = ['id', 'name','image']

class BannerSerializer(serializers.ModelSerializer):
    name = CitySerializer(read_only=True)

    class Meta:
        model = HomeBanner
        fields = ['id', 'name','image','tagline']

class PackageInquirySerializer(serializers.ModelSerializer):

    phone = serializers.RegexField(
        regex=r'^[0-9]{10,15}$',
        error_messages={"invalid": "Enter a valid phone number"}
    )
     
    class Meta:
        model = PackageInquiry
        fields = "__all__"
        read_only_fields = ["id", "created_at"]

class PackageItineraryImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = PackageItineraryImage
        fields = "__all__"
        
class PackageItinerarySerializer(serializers.ModelSerializer):

    images = PackageItineraryImageSerializer(many=True, read_only=True)

    class Meta:
        model = PackageItinerary
        fields = "__all__"
    
    
class PackageImageSerializer(serializers.ModelSerializer):
    image = serializers.SerializerMethodField()

    class Meta:
        model = PackageImage
        fields = "__all__"

    def get_image(self, obj):
        request = self.context.get("request")
        if obj.image:
            if request:
                return request.build_absolute_uri(obj.image.url)
            return obj.image.url
        return None
    

class PackageSerializer(serializers.ModelSerializer):

    holiday = HolidaySerializer(read_only=True)
    location = CitySerializer(read_only=True)

    itineraries = serializers.SerializerMethodField()
    images = serializers.SerializerMethodField()

    class Meta:
        model = Package
        fields = "__all__"

    def get_itineraries(self, obj):
        data = PackageItinerary.objects.filter(package=obj)
        return PackageItinerarySerializer(
            data, many=True, context=self.context
        ).data

    def get_images(self, obj):
        data = PackageImage.objects.filter(package=obj)
        return PackageImageSerializer(
            data, many=True, context=self.context
        ).data
        
class CruisePackageImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = CruisePackageImage
        fields = ["id", "image", "created_at"]


# ==============================
# Cruise Itinerary Serializer
# ==============================
class CruiseItinerarySerializer(serializers.ModelSerializer):
    class Meta:
        model = CruiseItinerary
        fields = [
            "id",
            "title",
            "day",
            "place",
            "time_from",
            "time_to",
            "ship_from",
            "to",
            "description",
            "transfer_type",
            "created_at",
        ]


# ==============================
# Cruise Package Serializer
# ==============================
class CruisePackageSerializer(serializers.ModelSerializer):

    images = CruisePackageImageSerializer(many=True, required=False)
    itineraries = CruiseItinerarySerializer(many=True, required=False)

    class Meta:
        model = CruisePackage
        fields = [
            "id",
            "title",
            "subtitle",
            "package_type",
            "duration",
            "departed",
            "visiting",
            "description",
            "original_price",
            "discounted_price",
            "discount_percent",
            "taxes_included",
            "confirmation_policy",
            "refund_policy",
            "inclusions",
            "exclusions",
            "highlights",
            "slug",
            "is_active",
            "created_at",
            "updated_at",
            "images",
            "itineraries",
        ]
        read_only_fields = ["slug", "created_at", "updated_at"]

    # ==============================
    # CREATE
    # ==============================
    def create(self, validated_data):
        images_data = validated_data.pop("images", [])
        itineraries_data = validated_data.pop("itineraries", [])

        cruise_package = CruisePackage.objects.create(**validated_data)

        # Create Images
        for image in images_data:
            CruisePackageImage.objects.create(
                cruise_package=cruise_package,
                **image
            )

        # Create Itineraries
        for itinerary in itineraries_data:
            CruiseItinerary.objects.create(
                cruise_package=cruise_package,
                **itinerary
            )

        return cruise_package

    # ==============================
    # UPDATE
    # ==============================
    def update(self, instance, validated_data):
        images_data = validated_data.pop("images", None)
        itineraries_data = validated_data.pop("itineraries", None)

        for attr, value in validated_data.items():
            setattr(instance, attr, value)

        instance.save()

        # Update Images
        if images_data is not None:
            instance.images.all().delete()
            for image in images_data:
                CruisePackageImage.objects.create(
                    cruise_package=instance,
                    **image
                )

        # Update Itineraries
        if itineraries_data is not None:
            instance.itineraries.all().delete()
            for itinerary in itineraries_data:
                CruiseItinerary.objects.create(
                    cruise_package=instance,
                    **itinerary
                )

        return instance
    
class ContactUsSerializer(serializers.ModelSerializer):
    class Meta:
        model = ContactUs
        fields = "__all__"

class PackageInquirySerializer(serializers.ModelSerializer):
    class Meta:
        model = PackageInquiry
        fields = "__all__"

class CruisePackageInquirySerializer(serializers.ModelSerializer):
    class Meta:
        model = CruisePackageInquiry
        fields = "__all__"

class GallerySerializer(serializers.ModelSerializer):
    class Meta:
        model = Gallery
        fields = "__all__"

class ReviewSerializer(serializers.ModelSerializer):
    class Meta:
        model = Review
        fields = "__all__"