from rest_framework import serializers

from .models import Sale, SaleLine, Product, Customer, ReconciliationJar


class SaleLineSerializer(serializers.ModelSerializer):
    class Meta:
        model = SaleLine
        fields = ['id', 'sale', 'product', 'unit_price', 'quantity']


class SaleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Sale
        fields = ['id', 'customer', 'date', 'saleline_set']


class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = ['id', 'name', 'price', 'measuring_unit', 'categories']


class CustomerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Customer
        fields = ['id', 'name', 'address', 'email', 'phone']


class ReconciliationJarSerializer(serializers.ModelSerializer):
    class Meta:
        model = ReconciliationJar
        fields = [
            'id',
            'date_time',
            'reconcilier',
            'cash_taken',
            'cash_discrepancy',
            'total_cash_purchases',
        ]

class PaymentMethodSerializer(serializers.Serializer):
    text = serializers.CharField()
    value = serializers.CharField()

    def to_representation(self, instance):
        return {
            'text': instance[1],
            'value': instance[0],
        }

class SaleForRenconciliationSerializer(serializers.Serializer):
    id = serializers.IntegerField()
    date = serializers.DateTimeField()
    payment_method = serializers.CharField()
    customer = serializers.SerializerMethodField()
    total = serializers.SerializerMethodField()

    def get_customer(self, sale):
        return {
            'id': sale.customer.id,
            'name': sale.customer.name,
        }

    def get_total(self, sale):
        return sale.get_total()


class ListCustomerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Customer
        fields = ['id', 'name']


class ListProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = ['id', 'name']


class SummarySaleLineSerializer(serializers.ModelSerializer):
    product = ListProductSerializer()

    class Meta:
        model = SaleLine
        fields = ['product', 'quantity', 'unit_price', 'description']


class SaleSummarySerializer(serializers.ModelSerializer):
    customer = ListCustomerSerializer()
    lines = SummarySaleLineSerializer(many=True, source='saleline_set')

    class Meta:
        model = Sale
        fields = ['id', 'date', 'customer', 'payment_method', 'lines']