from rest_framework import serializers

from .models import Order, OrderEvent


class OrderEventSerializer(serializers.ModelSerializer):
    changed_by_name = serializers.CharField(source='changed_by.name', default=None, read_only=True)

    class Meta:
        model = OrderEvent
        fields = ['id', 'from_status', 'to_status', 'note',
                  'changed_by', 'changed_by_name', 'created_at']


class OrderSerializer(serializers.ModelSerializer):
    """Maps the internal model onto the existing /sales row contract."""

    product = serializers.CharField(source='product_name', read_only=True)
    product_id = serializers.IntegerField(read_only=True)
    user_id = serializers.IntegerField(read_only=True)
    seller_name = serializers.CharField(source='user.name', read_only=True)

    class Meta:
        model = Order
        fields = [
            'id', 'user_id', 'product_id', 'product',
            'selling_price', 'profit', 'commission', 'commission_percent',
            'category', 'product_code', 'buying_price', 'vat_amount', 'quantity',
            'customer_name', 'customer_phone', 'order_number', 'status',
            'item_notes', 'selected_size', 'selected_color', 'admin_notes',
            'reviewed_by', 'completed_at', 'logistics_status',
            'payment_proof', 'product_images', 'seller_name',
            'created_at', 'updated_at',
        ]


class OrderDetailSerializer(OrderSerializer):
    timeline = serializers.SerializerMethodField()

    class Meta(OrderSerializer.Meta):
        fields = OrderSerializer.Meta.fields + ['timeline']

    def get_timeline(self, obj):
        events = obj.events.all().order_by('created_at')
        return OrderEventSerializer(events, many=True).data


class PlaceOrderItemSerializer(serializers.Serializer):
    product_id = serializers.IntegerField()
    quantity = serializers.IntegerField(default=1, min_value=1)
    selected_size = serializers.CharField(required=False, allow_blank=True)
    selected_color = serializers.CharField(required=False, allow_blank=True)
    notes = serializers.CharField(required=False, allow_blank=True)


class BatchOrderSerializer(serializers.Serializer):
    items = PlaceOrderItemSerializer(many=True)
    customer_name = serializers.CharField(required=False, allow_blank=True, default='')
    customer_phone = serializers.CharField(required=False, allow_blank=True, default='')
