# Shell MasterCard
#
# Douglas Thrift
#
# $Id$

import bank
from ClientForm import FormParser
from datetime import datetime
import decimal
from mechanize import LinkNotFoundError
import re
import website

class _FormParser(FormParser):
	def __init__(self, *args, **kwargs):
		FormParser.__init__(self, *args, **kwargs)

	def do_input(self, attributes):
		self.__enable(attributes)
		FormParser.do_input(self, attributes)

	def start_select(self, attributes):
		self.__name = None

		for name, value in attributes:
			if name == 'name':
				self.__name = value

		self.__enable(attributes)
		FormParser.start_select(self, attributes)

	def end_select(self):
		if self.__name == 'download_date':
			self.do_option([('value', 'Activity Since Last Statement')])
		elif self.__name == 'download_format':
			self.do_option([('value', 'QIF')])

		FormParser.end_select(self)

	def __enable(self, attributes):
		try:
			attributes.remove(('disabled', 'disabled'))
		except ValueError:
			pass

class Bank(website.Website, bank.Bank):
	PAYMENT_DUE = re.compile(r'([A-Z][a-z]{2})\.?( \d{1,2}, \d{4})')

	def __init__(self, config, debug):
		website.Website.__init__(self, debug, factory = website.Factory(_FormParser))
		bank.Bank.__init__(self, config)

		self.browser.open('http://www.shellmc.accountonline.com/')
		self.browser.select_form(name = 'LOGIN')

		self.browser['USERNAME'] = self._username()
		self.browser['PASSWORD'] = self._password()

		self.browser.submit()

	def __del__(self):
		try:
			self.browser.follow_link(text_regex = 'Log Out')
		except (AttributeError, LinkNotFoundError):
			pass

	def download(self, account):
		try:
			balance = -decimal.Decimal(str(self.Soup(self._follow_link(text_regex = str(account))).find(attrs = {'class': 'curr_balance'}).string[1:]).translate(None, ','))

			self._follow_link(text_regex = 'View/Download Your Statement')
			self.browser.select_form(name = 'download_statement')

			self.browser.form.action = 'https://www.accountonline.com/cards/svc/StatementDownload.do?dateRange=unbilled&viewType=qif'
			self.browser['download_date'] = ['Activity Since Last Statement']
			self.browser['download_format'] = ['QIF']

			return self._submit().read(), balance
		finally:
			self._back()

	def due(self, account):
		try:
			return datetime.strptime(''.join(self.PAYMENT_DUE.search(self.Soup(self._follow_link(text_regex = str(account))).find(text = re.compile('Payment Due')).findNext(text = self.PAYMENT_DUE)).group(1, 2)), '%b %d, %Y').date()
		finally:
			self._back()
