#!/usr/bin/env python2.7
# -*- Mode: Python; coding: utf-8 -*-

#	$Id: stripe2ledger,v 1.2 2019/04/19 15:36:31 riastradh Exp $

import csv
import datetime
import sys


def unirow(row):
    return tuple(unicode(x, 'utf-8') for x in row)

def stripe_date(string):
    return datetime.datetime.strptime(string, '%Y-%m-%d %H:%M')

def negate(s):
    return s[1:] if s.startswith('-') else '-%s' % (s,)

reader = csv.reader(sys.stdin)
header = unirow(reader.next())
H = {h: i for i, h in enumerate(header)}
first = True
for r in reader:
    R = lambda h: r[H[h]]
    id = R('id')
    source = R('Source')
    date = stripe_date(R('Created (UTC)')).strftime('%Y-%m-%d')
    description = R('Description')
    our_gross_amt = R('Amount')
    our_gross_cur = R('Currency').upper()
    fee = R('Fee')
    their_gross_amt = R('Customer Facing Amount') or our_gross_amt
    their_gross_cur = R('Customer Facing Currency').upper() or our_gross_cur
    if first:
        first = False
    else:
        print
    print '%s %s' % (date, description)
    print '    ; stripe_txn:: "%s"' % (id,)
    print '    ; stripe_id:: "%s"' % (source,)
    if R('Type') == 'payout':
        assert our_gross_amt == their_gross_amt
        assert our_gross_cur == their_gross_cur
        gross_amt = our_gross_amt
        gross_cur = our_gross_cur
        print '    Assets:Stripe:Payout  %s %s' % \
            (negate(gross_amt), gross_cur)
        print '    Assets:Stripe:Balance  %s %s' % (gross_amt, gross_cur)
        print '    Assets:Stripe:Balance  %s %s' % (negate(fee), gross_cur)
        print '    Expenses:Fees:Stripe  %s %s' % (fee, gross_cur)
    elif R('Type') == 'charge':
        # Stripe does the currency conversion for us.  Doing it all in
        # USD is a little simpler.
        their_gross_amt = our_gross_amt
        their_gross_cur = our_gross_cur
        print '    Assets:Stripe:Balance  %s %s' % \
            (our_gross_amt, our_gross_cur)
        print '    Income:Donations:Stripe  %s %s' % \
            (negate(their_gross_amt), their_gross_cur)
        print '    Assets:Stripe:Balance  %s %s' % (negate(fee), our_gross_cur)
        print '    Expenses:Fees:Stripe  %s %s' % (fee, our_gross_cur)
    elif R('Type') == 'adjustment':
        assert our_gross_amt == their_gross_amt
        assert our_gross_cur == their_gross_cur
        gross_amt = our_gross_amt
        gross_cur = our_gross_cur
        print '    Assets:Stripe:Balance  %s %s' % (negate(fee), gross_cur)
        print '    Expenses:Fees:Stripe  %s %s' % (fee, gross_cur)
    else:
        raise Exception('I dunno how to cope with tx type: %s' % (R('Type'),))
