from rest_framework import serializers

from apps.core.i18n import localized_field
from apps.stores.models import Store
from apps.stores.serializers import CategorySerializer, PaymentMethodSerializer, StoreBranchSerializer


class StoreDetailSerializer(serializers.ModelSerializer):
    name = serializers.SerializerMethodField()
    description = serializers.SerializerMethodField()
    categories = CategorySerializer(many=True, read_only=True)
    payment_methods = PaymentMethodSerializer(many=True, read_only=True)
    branches = StoreBranchSerializer(many=True, read_only=True)

    class Meta:
        model = Store
        fields = [
            "id", "name", "name_en", "name_ar", "logo", "cover",
            "description", "description_en", "description_ar",
            "rating", "rating_count", "views",
            "local_delivery_days", "intl_delivery_days",
            "is_online", "is_in_store",
            "is_top", "is_recommended", "is_recently_added",
            "is_trending", "has_deals", "supports_installments",
            "categories", "payment_methods", "branches",
            "created_at",
        ]

    def get_name(self, obj):
        return localized_field(obj, "name")

    def get_description(self, obj):
        return localized_field(obj, "description")


class StoreReviewSerializer(serializers.ModelSerializer):
    from apps.users.serializers import UserSerializer

    user = UserSerializer(read_only=True)

    class Meta:
        from apps.stores.models import StoreReview
        model = StoreReview
        fields = ["id", "user", "rating", "title", "comment", "created_at"]
        read_only_fields = ["id", "user", "created_at"]


class StoreReviewCreateSerializer(serializers.ModelSerializer):
    class Meta:
        from apps.stores.models import StoreReview
        model = StoreReview
        fields = ["rating", "title", "comment"]

    def validate_rating(self, value):
        if value < 1 or value > 5:
            raise serializers.ValidationError("Rating must be between 1 and 5.")
        return value
