from rest_framework import serializers
from .models import BusinessPlatformLinks, ReviewLink, Review


class ReviewLinkSerializer(serializers.ModelSerializer):
    tour_id = serializers.UUIDField(source="tour.id", read_only=True)
    your_tour_id = serializers.CharField(source="tour.external_id", read_only=True)
    tour_name = serializers.CharField(source="tour.name", read_only=True)

    class Meta:
        model = ReviewLink
        fields = [
            "id", "tour_id", "your_tour_id", "tour_name",
            "customer_email", "token_uuid", "token_str", "expires_at"
        ]
        read_only_fields = fields


class ReviewSerializer(serializers.ModelSerializer):
    tour_id = serializers.UUIDField(source="tour.id", read_only=True)
    your_tour_id = serializers.CharField(source="tour.external_id", read_only=True)

    class Meta:
        model = Review
        fields = "__all__"
        read_only_fields = ("id", "tour", "submitted_at", "source", "customer_email")


class ReviewSubmitSerializer(serializers.ModelSerializer):
    class Meta:
        model = Review
        fields = ["rating", "comment", "photos"]
        extra_kwargs = {
            "rating": {"required": False},
            "comment": {"required": False},
            "photos": {"required": False},
        }


class ReviewAnalyticsSerializer(serializers.Serializer):
    average_rating = serializers.FloatField()
    total_reviews = serializers.IntegerField()
    by_source = serializers.ListField(
        child=serializers.DictField(child=serializers.IntegerField())
    )


class BusinessPlatformLinksSerializer(serializers.ModelSerializer):
    class Meta:
        model = BusinessPlatformLinks
        fields = [
            "id", "business_name", "business_address",
            "google_review_url", "tripadvisor_review_url",
            "booking_review_url", "facebook_review_url",
            "created_at", "updated_at",
        ]
        read_only_fields = ["id", "created_at", "updated_at"]

    def validate_google_review_url(self, value):
        if value and not value.startswith("https://search.google.com/local/writereview"):
            raise serializers.ValidationError(
                "Invalid Google review URL. Should start with 'https://search.google.com/local/writereview'"
            )
        return value

    def validate_tripadvisor_review_url(self, value):
        if value and "tripadvisor.com" not in value:
            raise serializers.ValidationError(
                "Invalid TripAdvisor URL. Should contain 'tripadvisor.com'"
            )
        return value

    def validate_facebook_review_url(self, value):
        if value and "facebook.com" not in value:
            raise serializers.ValidationError(
                "Invalid Facebook URL. Should contain 'facebook.com'"
            )
        return value

    def validate_booking_review_url(self, value):
        if value and "booking.com" not in value:
            raise serializers.ValidationError(
                "Invalid Booking.com URL. Should contain 'booking.com'"
            )
        return value


class PlatformLinksReadSerializer(serializers.ModelSerializer):
    configured_platforms = serializers.SerializerMethodField()
    platforms_count = serializers.SerializerMethodField()

    class Meta:
        model = BusinessPlatformLinks
        fields = [
            "id", "business_name", "business_address",
            "google_review_url", "tripadvisor_review_url",
            "booking_review_url", "facebook_review_url",
            "configured_platforms", "platforms_count",
            "created_at", "updated_at",
        ]

    def get_configured_platforms(self, obj):
        return obj.get_configured_platforms()

    def get_platforms_count(self, obj):
        return len(obj.get_configured_platforms())
