import datetime

import vanth.ofx


def MST():
    return datetime.timezone(datetime.timedelta(hours=-7), 'MST')

def MDT():
    return datetime.timezone(datetime.timedelta(hours=-6), 'MDT')

def test_query_transactions(mocker):
    institution = {
        'bankid'    : "1234567",
        'fid'       : "12345",
        'name'      : "AFCU",
    }
    account = {
        "account_id"    : "123456-0.9:CHK",
        "user_id"       : "123456789",
        "password"      : "1234",
        "type"          : "checking",
    }
    with mocker.patch('vanth.ofx.now', return_value='20160102030405.000[-7:MST]'):
        results = vanth.ofx.query_transactions(institution, account, start=datetime.date(2016, 1, 2))
    with open('tests/files/query_transactions.ofx', 'rb') as f:
        expected = f.read().decode('utf-8')
    assert results == expected

def test_parse():
    with open('tests/files/transactions.ofx', 'rb') as f:
        transactions = f.read().decode('utf-8')
    document = vanth.ofx.parse(transactions)
    assert document.header == {
        'CHARSET'       : '1252',
        'COMPRESSION'   : 'NONE',
        'DATA'          : 'OFXSGML',
        'ENCODING'      : 'USASCII',
        'NEWFILEUID'    : 'NONE',
        'OFXHEADER'     : '100',
        'OLDFILEUID'    : 'NONE',
        'SECURITY'      : 'NONE',
        'VERSION'       : '102'
    }
    assert document.body.status.code == '0'
    assert document.body.status.severity == 'INFO'
    assert document.body.status.message == 'The operation succeeded.'
    assert document.body.statement.status.code == '0'
    assert document.body.statement.status.severity == 'INFO'
    assert document.body.statement.status.message is None
    assert document.body.statement.transactions.currency == 'USD'
    assert document.body.statement.transactions.account.accountid == '123456-0.9:CHK'
    assert document.body.statement.transactions.account.bankid == '324377516'
    assert document.body.statement.transactions.account.type == 'CHECKING'
    assert document.body.statement.transactions.start == datetime.datetime(2015, 12, 31, 17, 0, tzinfo=MST())
    assert document.body.statement.transactions.end == datetime.datetime(2016, 6, 22, 11, 12, 42, tzinfo=MDT())
    expected_items = [{
        'amount'    : -50.19,
        'available' : datetime.datetime(2015, 12, 31, 12),
        'id'        : '0006547',
        'memo'      : 'POINT OF SALE PURCHASE #0006547',
        'name'      : 'UT LEHI COSTCO WHSE #0733',
        'posted'    : datetime.datetime(2015, 12, 31, 12),
        'type'      : 'POS',
    },{
        'amount'    : -79.64,
        'available' : datetime.datetime(2015, 12, 31, 12),
        'id'        : '0006548',
        'memo'      : '#0006548',
        'name'      : 'Payment to PACIFICORP ONLIN',
        'posted'    : datetime.datetime(2015, 12, 31, 12),
        'type'      : 'PAYMENT',
    },{
        'amount'    : 0.84,
        'available' : datetime.datetime(2015, 12, 31, 12),
        'id'        : '0006549',
        'memo'      : 'ANNUAL PERCENTAGE YIELD EARNED IS   .05% #0006549',
        'name'      : 'DIVIDEND FOR 12/01/15 - 12/31/1',
        'posted'    : datetime.datetime(2015, 12, 31, 12),
        'type'      : 'INT',
    }]
    items = [dict(item) for item in document.body.statement.transactions.items]
    assert items == expected_items