from rest_framework import serializers
from users.models import User
from notifications.utils import send_notification
from .models import *


class OrderItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = OrderItem
        fields = ['menu_item', 'quantity']
        extra_kwargs = {
            'menu_item': {'queryset': MenuItem.objects.all()}
        }


class OrderCreateSerializer(serializers.ModelSerializer):
    items = OrderItemSerializer(many=True)

    class Meta:
        model = Order
        fields = ['id', 'order_type', 'items', 'status', 'total_amount', 'created_at']
        read_only_fields = ['id', 'total_amount', 'created_at']

    def create(self, validated_data):
     items_data = validated_data.pop('items')
     user = self.context['request'].user
     order_type = validated_data.get("order_type")

     order = Order.objects.create(
        customer=user,
        order_type=order_type,
        status="PREPARING"
    )

     total_amount = 0

     for item_data in items_data:
        menu_item = item_data['menu_item']
        quantity = item_data['quantity']

        subtotal = menu_item.price * quantity

        # 🔥 Add correct fee
        if order_type == "DELIVERY":
            subtotal += menu_item.delivery_fee
        else:
            subtotal += menu_item.order_fee

        OrderItem.objects.create(
            order=order,
            menu_item=menu_item,
            quantity=quantity,
            subtotal=subtotal
        )

        total_amount += subtotal

     order.total_amount = total_amount
     order.save()

     return order


class OrderItemReadSerializer(serializers.ModelSerializer):
    menu_item = serializers.IntegerField(source='menu_item_id', read_only=True)
    menu_item_name = serializers.CharField(source='menu_item.name', read_only=True)
    menu_item_price = serializers.DecimalField(
        source='menu_item.price',
        max_digits=10,
        decimal_places=2,
        read_only=True
    )

    class Meta:
        model = OrderItem
        fields = ['id', 'menu_item', 'menu_item_name', 'menu_item_price', 'quantity', 'subtotal']


class OrderListSerializer(serializers.ModelSerializer):
    customer_username = serializers.CharField(source='customer.username', read_only=True)
    phone_number = serializers.CharField(source='customer.phone_number', read_only=True, allow_null=True)
    items_count = serializers.SerializerMethodField()
    items = OrderItemReadSerializer(many=True, read_only=True)

    class Meta:
        model = Order
        fields = [
            'id',
            'customer',
            'customer_username',
            'phone_number',
            'order_type',
            'status',
            'is_favorite',
            'total_amount',
            'created_at',
            'items_count',
            'items',
        ]

    def get_items_count(self, obj):
        return obj.items.count()


class CartItemSerializer(serializers.ModelSerializer):
    subtotal = serializers.SerializerMethodField()

    class Meta:
        model = CartItem
        fields = ['id', 'menu_item', 'quantity', 'subtotal']

    def get_subtotal(self, obj):
        return obj.menu_item.price * obj.quantity


class CartSerializer(serializers.ModelSerializer):
    items = CartItemSerializer(many=True)
    total_price = serializers.SerializerMethodField()

    class Meta:
        model = Cart
        fields = ['id', 'items', 'total_price']

    def get_total_price(self, obj):
        return sum(
            item.menu_item.price * item.quantity
            for item in obj.items.all()
        )
        
