# -*- coding: UTF-8 -*-
# pylint: disable=C0111,R0903

"""Display a stock quote from yahoo finance.

Requires the following python packages:
    * requests

Parameters:
    * stock.symbols : Comma-separated list of symbols to fetch
    * stock.change : Should we fetch change in stock value (defaults to True)
    * stock.currencies : List of symbols to go with the values (default $)
"""

import bumblebee.input
import bumblebee.output
import bumblebee.engine
import bumblebee.util

import requests

import logging

class Module(bumblebee.engine.Module):
    def __init__(self, engine, config):
        super(Module, self).__init__(engine, config,
            bumblebee.output.Widget(full_text=self.value)
        )
        self._symbols = self.parameter('symbols', '')
        self._change = bumblebee.util.asbool(self.parameter('change', True))
        self._currencies = self.parameter('currencies', None)
        self._baseurl = 'http://download.finance.yahoo.com/d/quotes.csv'
        self._value = self.fetch()
        self.interval(60)

        if not self._currencies:
            self._currencies = '$' * len(self._symbols)

        # The currencies could be unicode, like the € symbol. Convert to a unicode object.
        if hasattr(self._currencies, 'decode'):
            self._currencies = self._currencies.decode('utf-8', 'ignore')

    def value(self, widget):
        results = []
        if not self._value:
            return 'n/a'
        for i, val in enumerate(self._value.split('\n')):
            try:
                currency_symbol = self._currencies[i]
            except:
                currency_symbol = '$'
            results.append('%s%s' % (currency_symbol, val))
        return u' '.join(results)

    def fetch(self):
        if self._symbols:
            url = self._baseurl
            url += '?s=%s&f=l1' % self._symbols
            if self._change:
                url += 'c1'
            return requests.get(url).text.strip()
        else:
            logging.error('unable to retrieve stock exchange rate')
            return None

    def update(self, widgets):
        self._value = self.fetch()

# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4