#!python

import os
import sys
import time
import json
import datetime
import yaml
import pwd
from monzo_utils.lib.config import Config
from monzo_utils.lib.db import DB
from monzo_utils.model.provider import Provider
from monzo_utils.model.account import Account
from monzo_utils.model.pot import Pot
from monzo_utils.model.transaction import Transaction

PROVIDER = 'Monzo'

FIELD_MAP = {
    'date': 'created_at'
}

class Monzo:

    widths = {}

    def accounts(self, first=True):
        transactions = False
        n = 10

        for i in range(0, len(sys.argv)):
            if sys.argv[i] == '-t':
                transactions = True
                if i+1 < len(sys.argv) and sys.argv[i+1].isdigit():
                    n = int(sys.argv[i+1])

        provider = Provider.one("select * from provider where name = %s", [PROVIDER])
        accounts = provider.accounts(order=Config().account_order if 'account_order' in Config().keys else None)

        count = 0
        for account in accounts:
            self.display([account], account.keys, show_headers=(count == 0 or transactions))

            if transactions:
                sys.stdout.write("\n")

                rows = list(reversed(account.transactions(orderby='created_at', orderdir='desc', limit=n)))

                self.display(rows, Transaction.DISPLAY_KEYS)

                sys.stdout.write("\n")

            count += 1


    def get_column_widths(self, data, columns):
        for key in columns:
            if key in ['balance','available']:
                if key not in self.widths or self.widths[key] <8:
                    self.widths[key] = 8
            else:
                if key not in self.widths or self.widths[key] < len(key):
                    self.widths[key] = len(key)

        for i in range(0, len(data)):
            if type(data[i]) != dict:
                obj = data[i].__dict__['attributes']
            else:
                obj = data[i]

            for key in columns:
                if key in FIELD_MAP:
                    obj[key] = obj[FIELD_MAP[key]]

                if key not in obj or obj[key] is None:
                    obj[key] = ''

                if obj[key] == datetime.datetime:
                    obj[key] = obj[key].strftime('%d.%m.%Y %H:%M')

                if len(str(obj[key])) > self.widths[key]:
                    self.widths[key] = len(str(obj[key]))
 
 
    def display(self, data, columns, show_headers=True):
        self.get_column_widths(data, columns)

        if show_headers:
            for key in columns:
                sys.stdout.write(self.capitalise(key).ljust(self.widths[key]+2))
            sys.stdout.write("\n")

            for key in columns:
                sys.stdout.write('-' * (self.widths[key]+2))
            sys.stdout.write("\n")

        for i in range(0, len(data)):
            if type(data[i]) != dict:
                obj = data[i].__dict__['attributes']
            else:
                obj = data[i]

            for key in columns:
                sys.stdout.write(str(obj[key]).ljust(self.widths[key]+2))

            sys.stdout.write("\n")


    def capitalise(self, string):
        return string.title().replace('_','')


m = Monzo()
m.accounts()
