"""
This module provides a Python API for retrieving stock data from Yahoo Finance.

There is NO need to modify this file.

sample usage:
>>> import ystockquote
>>> print ystockquote.getPrice('GOOG')
529.46
"""
import urllib


def getHistoricalPrices (symbol, startDate, endDate):
    """
    Get historical prices for the given ticker symbol.
    Date format is 'YYYYMMDD'

    Returns a nested list.
    """
    (sy,sm,sd) = startDate.split('-')
    (ey,em,ed) = endDate.split('-')    
    url = 'http://ichart.yahoo.com/table.csv?s=%s&' % symbol + \
          'a=%s&b=%s&c=%s&' % (int(sm)-1, sd, sy) + \
          'g=d&' + \
          'd=%s&e=%s&f=%s&' % (int(em)-1, ed, ey)
    days = urllib.urlopen(url).readlines()
    return [ day[:-2].split(',') for day in days ]


# for current data
# private function, do NOT call it directly
def __request (symbol, stat):
    url = 'http://finance.yahoo.com/d/quotes.csv?s=%s&f=%s' % (symbol, stat)
    return urllib.urlopen(url).read().strip().strip('"')


def getAll (symbol):
    """
    Get all available quote data for the given ticker symbol.
    
    Returns a dictionary.
    """
    values = __request(symbol, 'l1c1va2xj1b4j4dyekjm3m4rr5p5p6s7').split(',')
    data = {}
    data['price'] = values[0]
    data['change'] = values[1]
    data['volume'] = values[2]
    data['avg_daily_volume'] = values[3]
    data['stock_exchange'] = values[4]
    data['market_cap'] = values[5]
    data['book_value'] = values[6]
    data['ebitda'] = values[7]
    data['dividend_per_share'] = values[8]
    data['dividend_yield'] = values[9]
    data['earnings_per_share'] = values[10]
    data['52_week_high'] = values[11]
    data['52_week_low'] = values[12]
    data['50day_moving_avg'] = values[13]
    data['200day_moving_avg'] = values[14]
    data['price_earnings_ratio'] = values[15]
    data['price_earnings_growth_ratio'] = values[16]
    data['price_sales_ratio'] = values[17]
    data['price_book_ratio'] = values[18]
    data['short_ratio'] = values[19]
    return data


def getPrice (symbol): 
    return __request(symbol, 'l1')

def getChange (symbol):
    return __request(symbol, 'c1')
    
def getVolume (symbol): 
    return __request(symbol, 'v')

def getAverageDailyVolume (symbol): 
    return __request(symbol, 'a2')

def getStockExchange (symbol): 
    return __request(symbol, 'x')

def getMarketCap (symbol):
    return __request(symbol, 'j1')

def getBookValue (symbol):
    return __request(symbol, 'b4')

def getEbitda (symbol): 
    return __request(symbol, 'j4')

def getDividendPerShare (symbol):
    return __request(symbol, 'd')

def getDividendYield (symbol): 
    return __request(symbol, 'y')

def getEarningsPerShare (symbol): 
    return __request(symbol, 'e')

def get52WeekHigh (symbol): 
    return __request(symbol, 'k')
    
def get52WeekLow (symbol): 
    return __request(symbol, 'j')

def get50dayMovingAverage (symbol): 
    return __request(symbol, 'm3')

def get200DayMovingAverage (symbol): 
    return __request(symbol, 'm4')

def getPriceEarningsRatio (symbol): 
    return __request(symbol, 'r')

def getPriceEarningsGrowthRatio(symbol): 
    return __request(symbol, 'r5')

def getPriceSalesRatio (symbol): 
    return __request(symbol, 'p5')
    
def getPriceBookRatio (symbol): 
    return __request(symbol, 'p6')

def getShortRatio (symbol): 
    return __request(symbol, 's7')
