from rest_framework import serializers
from .models import *
from uncloud_vm.serializers import ManagedVMProductSerializer
from uncloud_vm.models import VMProduct
from uncloud_pay.models import RecurringPeriod, BillingAddress

# XXX: the OrderSomethingSomthingProductSerializer classes add a lot of
# boilerplate: can we reduce it somehow?

class MatrixServiceProductSerializer(serializers.ModelSerializer):
    vm = ManagedVMProductSerializer()

    class Meta:
        model = MatrixServiceProduct
        fields = ['order', 'owner', 'status', 'vm', 'domain',
                'recurring_period']
        read_only_fields = ['order', 'owner', 'status']

class OrderMatrixServiceProductSerializer(MatrixServiceProductSerializer):
    # recurring_period = serializers.ChoiceField(
    #         choices=MatrixServiceProduct.allowed_recurring_periods())

    def __init__(self, *args, **kwargs):
        super(OrderMatrixServiceProductSerializer, self).__init__(*args, **kwargs)
        self.fields['billing_address'] = serializers.ChoiceField(
                choices=BillingAddress.get_addresses_for(
                    self.context['request'].user)
                )

    class Meta:
        model = MatrixServiceProductSerializer.Meta.model
        fields = MatrixServiceProductSerializer.Meta.fields + [
                'recurring_period', 'billing_address'
                ]
        read_only_fields = MatrixServiceProductSerializer.Meta.read_only_fields

class GenericServiceProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = GenericServiceProduct
        fields = ['order', 'owner', 'status', 'custom_recurring_price',
                'custom_description', 'custom_one_time_price']
        read_only_fields = [ 'owner', 'status']

class OrderGenericServiceProductSerializer(GenericServiceProductSerializer):
    # recurring_period = serializers.ChoiceField(
    #         choices=GenericServiceProduct.allowed_recurring_periods())

    def __init__(self, *args, **kwargs):
        super(OrderGenericServiceProductSerializer, self).__init__(*args, **kwargs)
        self.fields['billing_address'] = serializers.ChoiceField(
                choices=BillingAddress.get_addresses_for(
                    self.context['request'].user)
                )

    class Meta:
        model = GenericServiceProductSerializer.Meta.model
        fields = GenericServiceProductSerializer.Meta.fields + [
                'recurring_period', 'billing_address'
                ]
        read_only_fields = GenericServiceProductSerializer.Meta.read_only_fields
