from rest_framework import serializers
from rest_framework.pagination import PageNumberPagination
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from .models import DiscountRule, Product, ProductImage, Cart, CartItem, Order, OrderItem, Notification, User
import json

# ================= PAGINATION =================
class StandardPagination(PageNumberPagination):
    page_size = 10
    page_size_query_param = "page_size"
    max_page_size = 100


# ================= PRODUCT IMAGES =================
class ProductImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = ProductImage
        fields = ["id", "image"]


class ProductSerializer(serializers.ModelSerializer):
    images = serializers.ListField(
        child=serializers.ImageField(),
        write_only=True,
        required=False,
        allow_empty=True
    )
    product_images = ProductImageSerializer(source="images", many=True, read_only=True)

    class Meta:
        model = Product
        fields = [
            "id",
            "name",
            "description",
            "price",
            "quantity",
            "color",
            "sizes",
            "style",          # ✅ include style if added in Product model
            "is_active",
            "images",
            "product_images",
        ]

    def validate_sizes(self, value):
        if isinstance(value, str):
            try:
                value = json.loads(value)
            except Exception:
                value = [s.strip() for s in value.split(",") if s.strip()]
        return value

    def create(self, validated_data):
        images_data = validated_data.pop("images", [])
        product = Product.objects.create(**validated_data)

        # Save images
        for img in images_data:
            ProductImage.objects.create(product=product, image=img)

        return product


# ================= CART SERIALIZERS =================
class CartItemSerializer(serializers.ModelSerializer):
    product = ProductSerializer(read_only=True)

    class Meta:
        model = CartItem
        fields = ["id", "product", "quantity", "color", "size"]


class CartSerializer(serializers.ModelSerializer):
    items = CartItemSerializer(many=True, read_only=True)

    class Meta:
        model = Cart
        fields = ["id", "created_at", "items"]


# ================= USER SERIALIZER =================
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ["id", "username", "phone","role"]
# ================= ORDER SERIALIZER =================
class OrderItemSerializer(serializers.ModelSerializer):
    product = ProductSerializer(read_only=True)

    class Meta:
        model = OrderItem
        fields = ["id", "product", "quantity", "color", "size"]


class OrderSerializer(serializers.ModelSerializer):
    items = OrderItemSerializer(many=True, read_only=True)
    user = UserSerializer(read_only=True)  # <-- add this line

    class Meta:
        model = Order
        fields = [
            "id",
            "user",                # <-- include!
            "items",
            "status",
            "payment_screenshot",
            "total_price",
            "discount",
            "paid_amount",
            "remaining_birr",
            "created_at",
        ]


# ================= NOTIFICATION SERIALIZER =================
class NotificationSerializer(serializers.ModelSerializer):
    class Meta:
        model = Notification
        fields = "__all__"




# ================= JWT CUSTOM SERIALIZER =================
class CustomTokenObtainPairSerializer(TokenObtainPairSerializer):
    @classmethod
    def get_token(cls, user):
        token = super().get_token(user)
        token["role"] = user.role
        token["username"] = user.username
        return token


# ================= DISCOUNT RULE SERIALIZER =================
class DiscountRuleSerializer(serializers.ModelSerializer):
    product_name = serializers.CharField(source="product.name", read_only=True)

    class Meta:
        model = DiscountRule
        fields = ["id", "product", "product_name", "min_quantity", "discount_amount"]
