from functools import reduce
from rest_framework import mixins
from rest_framework.viewsets import GenericViewSet
from .models import Bill, Payment, PaymentMethod

def sum_amounts(entries):
    return reduce(lambda acc, entry: acc + entry.amount, entries, 0)

def get_balance_for(user):
    bills = sum_amounts(Bill.objects.filter(owner=user))
    payments = sum_amounts(Payment.objects.filter(owner=user))
    return payments - bills

def get_payment_method_for(user):
    methods = PaymentMethod.objects.filter(owner=user)
    for method in methods:
        # Do we want to do something with non-primary method?
        if method.primary:
            return method

    return None


class ProductViewSet(mixins.CreateModelMixin,
                   mixins.RetrieveModelMixin,
                   mixins.ListModelMixin,
                   GenericViewSet):
    """
    A customer-facing viewset that provides default `create()`, `retrieve()`
    and `list()`.
    """
    pass