from rest_framework import serializers
from .models import Sale, Customer


class CustomerSerializer(serializers.ModelSerializer):
    """Serializer for CRM customers"""
    sale_count = serializers.IntegerField(source='purchase_count', read_only=True)

    class Meta:
        model = Customer
        fields = [
            'id', 'name', 'phone', 'email', 'notes',
            'total_purchases', 'purchase_count', 'sale_count',
            'created_at', 'updated_at'
        ]
        read_only_fields = ['id', 'total_purchases', 'purchase_count', 'created_at', 'updated_at']

    def create(self, validated_data):
        request = self.context.get('request')
        validated_data['vendor'] = request.user.vendor_profile
        return super().create(validated_data)


class CustomerDetailSerializer(CustomerSerializer):
    """Detailed customer serializer with purchase history"""
    recent_sales = serializers.SerializerMethodField()

    class Meta(CustomerSerializer.Meta):
        fields = CustomerSerializer.Meta.fields + ['recent_sales']

    def get_recent_sales(self, obj):
        sales = obj.sales.order_by('-created_at')[:10]
        return SaleSerializer(sales, many=True).data


class SaleSerializer(serializers.ModelSerializer):
    """Serializer for POS sales"""
    customer_name = serializers.CharField(source='customer.name', read_only=True, allow_null=True)
    product_info = serializers.SerializerMethodField()

    class Meta:
        model = Sale
        fields = [
            'id', 'vendor', 'customer', 'customer_name', 'product', 'product_info',
            'product_name', 'quantity', 'unit_price', 'total_price',
            'payment_method', 'payment_reference', 'status', 'notes',
            'created_at', 'updated_at'
        ]
        read_only_fields = ['id', 'vendor', 'total_price', 'created_at', 'updated_at']

    def get_product_info(self, obj):
        if obj.product:
            return {
                'id': obj.product.id,
                'uuid': str(obj.product.uuid),
                'name': obj.product.name,
                'primary_image': obj.product.primary_image.url if obj.product.primary_image else None,
            }
        return None

    def validate(self, data):
        # Ensure either product or product_name is provided
        product = data.get('product')
        product_name = data.get('product_name')

        if not product and not product_name:
            raise serializers.ValidationError("Either product or product_name must be provided")

        # Auto-fill from product
        if product and not product_name:
            data['product_name'] = product.name

        # Calculate total_price
        quantity = data.get('quantity', 1)
        unit_price = data.get('unit_price')
        if unit_price:
            data['total_price'] = quantity * unit_price

        return data

    def create(self, validated_data):
        request = self.context.get('request')
        validated_data['vendor'] = request.user.vendor_profile
        return super().create(validated_data)


class SaleSummarySerializer(serializers.Serializer):
    """Serializer for sales summary/analytics"""
    total_sales = serializers.DecimalField(max_digits=12, decimal_places=2)
    total_transactions = serializers.IntegerField()
    average_sale = serializers.DecimalField(max_digits=10, decimal_places=2)
    payment_breakdown = serializers.DictField()
    daily_sales = serializers.ListField(child=serializers.DictField())
