from app import billing
from collections import defaultdict

offset = 0

def empty_tuple():
  return (0, 0)

plan_revenue = defaultdict(empty_tuple)

batch = billing.Customer.all(count=100, offset=offset)
while batch.data:
  for cust in batch.data:
    if cust.subscription:
      sub = cust.subscription
      total_customer_revenue = sub.plan.amount * sub.quantity

      if cust.discount and cust.discount.coupon:
        coupon = cust.discount.coupon

        if coupon.percent_off:
          total_customer_revenue *= (1 - coupon.percent_off/100.0)

        if coupon.amount_off:
          total_customer_revenue -= coupon.amount_off

      subscribers, revenue = plan_revenue[sub.plan.id]
      plan_revenue[sub.plan.id] = (subscribers + 1,
                                   revenue + total_customer_revenue)
  offset += len(batch.data)
  batch = billing.Customer.all(count=100, offset=offset)

def format_money(total_cents):
  dollars = total_cents / 100
  cents = total_cents % 100
  return dollars, cents

total_monthly_revenue = 0
for plan_id, (subs, rev) in plan_revenue.items():
  total_monthly_revenue += rev
  d, c = format_money(rev)
  print '%s: $%d.%02d(%s)' % (plan_id, d, c, subs)

d, c = format_money(total_monthly_revenue)
print 'Monthly revenue: $%d.%02d' % (d, c)