#!/usr/bin/python

import sys
import os, time
import urllib
from getopt import gnu_getopt, GetoptError

valid_cur = ["ARS","AUD","ALL","DZD","AWG","BSD","BHD","BDT","BBD","BYR","BZD","BMD","BTN","BOB","BRL","BND","GBP","BGN",
             "BIF","KHR","CAD","KYD","CLP","CNY","COP","KMF","CRC","HRK","CUP","CYP","CZK","DKK","DJF","DOP","ECS","EGP",
             "SVC","ERN","EEK","ETB","EUR","FKP","GMD","GHC","GIP","GTQ","GNF","HTG","HNL","HKD","HUF","ISK","INR","IDR",
             "IRR","ILS","JMD","JPY","JOD","KZT","KES","KRW","KWD","LAK","LVL","LBP","LSL","LYD","LTL","MOP","MKD","MGF",
             "MWK","MYR","MVR","MTL","MRO","MUR","MXN","MDL","MNT","MAD","MZM","NAD","NPR","ANG","TRY","NZD","NIO","NGN",
             "NOK","OMR","PKR","PAB","PGK","PYG","PEN","PHP","PLN","QAR","ROL","RON","RUB","RWF","WST","STD","SAR","SCR",
             "SLL","SGD","SKK","SIT","SOS","ZAR","LKR","SHP","SDD","SRG","SZL","SEK","CHF","SYP","TWD","TZS","THB","TOP",
             "TTD","TND","USD","AED","UGX","UAH","UYU","VUV","VEB","VND","YER","ZMK","ZWD"]

def getOptions():
    try:
        opts, args = gnu_getopt(sys.argv[1:], "qti:c:h", ["quotes", "ticker", "interval=", "currency=", "help"])
    except GetoptError:
        print("Invalid option(s)")
        showUsage()
        sys.exit(2)
    flags = []
    ticker_interval = 60
    amount = ""
    for opt, arg in opts:
        if opt in ("-h", "--help"):
            showUsage()
            sys.exit(0)
        if opt in ("-q", "--quotes"):
            flags.append("q")
        if opt in ("-t", "--ticker"):
            flags.append("t")
        if opt in ("-i", "--interval"):
            ticker_interval = int(arg)
        if opt in ("-c", "--currency"):
            flags.append("c")
            amount = arg
    if flags == []:
        flags = ['q']
    return flags, args, ticker_interval, amount


class Currency:
    '''
    '''
    def __init__(self, from_cur , to_cur, amount):
        self.amount = float(amount)
        self.from_cur = from_cur.upper()
        self.to_cur = to_cur.upper()
        if not self.from_cur in valid_cur:
            print "Invalid currency symbol: %s" % self.from_cur
            sys.exit(1)
        if not self.to_cur in valid_cur:
            print "Invalid currency symbol: %s" % self.to_cur
            sys.exit(1)
        self.urlPre = "http://finance.yahoo.com/d/quotes.csv?s="
        self.urlPost = "=X&f=sl1d1t1&e=.csv"
        self.symUrl = self.from_cur + self.to_cur
        self.url = self.urlPre + self.symUrl + self.urlPost

    def grabQuote(self):
        url = self.urlPre + self.symUrl + self.urlPost
        line = urllib.urlopen(url).readline().split(',')
        rate = float(line[1])
        result = self.amount * rate
        time = line[3][1:-3] # trim quotes and newline
        date = line[2][1:-1] # trim quotes
        print "%.2f %s at %f is %.2f %s as of %s %s" % (self.amount, self.from_cur, rate, result, self.to_cur, time, date)

class RetrieveQuotes:
    '''
    '''
    def __init__(self, symbols):
        self.symbols = symbols.sort()
        self.urlPre = "http://finance.yahoo.com/d/quotes.csv?s="
        self.urlPost = "&f=sl1cpoghrvt1&e=.csv"
        self.symUrl = "+".join(["%s" % sym for sym in symbols])
        self.url = self.urlPre + self.symUrl + self.urlPost

    def trend(p):
        pass

    def grabQuote(self):
        print "%-9s%9s%9s%9s%9s%9s%9s%9s%9s%10s%9s" % \
              ("Symbol","Last","Change","%","PrevC","Open","DayLo","DayHi","P/E","Volume","Time")
        output = []
        for line in urllib.urlopen(self.url).readlines():
            line = line.split(",")
            change = line[2][1:-1].split(" ")
            if change[0][0] == "+":
                os.system('echo -en $"\\033[0;32m"')
            elif change[0][0] == "-":
                os.system('echo -en $"\\033[1;31m"')
            print "%-9s%9s%9s%9s%9s%9s%9s%9s%9s%10s%9s" % \
                  (line[0][1:-1], line[1], change[0], change[2], line[3], line[4], line[5], line[6], line[7], line[8], line[9][1:-3])
            os.system('echo -en $"\\033[0;39m"')

def showUsage():
    print '''Usage: %s -q [options]... symbol [symbol]...
       %s -c amount from-currency to-currency
Options:
       '-q'   or '--quote'        quote mode
       '-c'   or '--currency'     currency mode
       '-t'   or '--ticker'       ticker mode
       '-i N' or '--interval=N'   set ticker interval to 'N' seconds
    ''' % (sys.argv[0], sys.argv[0])

def main():
    myopts = getOptions()
    if "q" in myopts[0]:
        x = RetrieveQuotes(myopts[1])
        x.grabQuote()
        sys.exit(0)
    if "t" in myopts[0]:
        x = RetrieveQuotes(myopts[1])
        try:
            while True:
                x.grabQuote()
                time.sleep(myopts[2])
                os.system('clear')
        except KeyboardInterrupt:
            print "Exiting gracefully..."
            sys.exit(0)
    if "c" in myopts[0]:
        x = Currency(myopts[1][0], myopts[1][1], myopts[3])
        x.grabQuote()
        sys.exit(0)

if __name__ == '__main__':
    main()