from matplotlib.ticker import MultipleLocator,FuncFormatter,NullFormatter
import matplotlib.pyplot as plt

import numpy as np

# Make pace ticks for pace axis '2:00', '1:50', etc
def format_pace_tick(x,pos=None):
	min=int(x/60)
	sec=int(x-min*60.)
	sec_str=str(sec).zfill(2)
	template='%d:%s'
	return template % (min,sec_str)

# Returns a pace string from a pace in seconds/500m, '1:45.4'
def format_pace(x,pos=None):
    if isinf(x) or isnan(x):
	x=0
	
    min=int(x/60)
    sec=(x-min*60.)

    str1 = "{min:0>2}:{sec:0>4.1f}".format(
	min = min,
	sec = sec
	)

    return str1

# Returns a time string from a time in seconds
def format_time(x,pos=None):


    min = int(x/60.)
    sec = int(x-min*60)

    str1 = "{min:0>2}:{sec:0>4.1f}".format(
	min=min,
	sec=sec,
	)

    return str1

# Formatting the distance tick marks
def format_dist_tick(x,pos=None):
	km = x/1000.
	template='%6.3f'
	return template % (km)

# Formatting the time tick marks (h:mm)
def format_time_tick(x,pos=None):
	hour=int(x/3600)
	min=int((x-hour*3600.)/60)
	min_str=str(min).zfill(2)
	template='%d:%s'
	return template % (hour,min_str)

# Utility to select reasonable y axis range
# Basically the data range plus some padding, but with ultimate
# you can set the slowest paces to fall off the axis.
# Useful for OTW rowing where you sometimes stops and pace runs out of
# the boundaries
def y_axis_range(ydata,miny=0,padding=.1,ultimate=[-1e9,1e9]):

    # ydata must by a numpy array

    ymin = np.ma.masked_invalid(ydata).min()
    ymax = np.ma.masked_invalid(ydata).max()


    yrange = ymax-ymin
    yrangemin = ymin
    yrangemax = ymax



    if (yrange == 0):
	if ymin == 0:
	    yrangemin = -padding
	else:
	    yrangemin = ymin-ymin*padding
	if ymax == 0:
	    yrangemax = padding
	else:
	    yrangemax = ymax+ymax*padding
    else:
	yrangemin = ymin-padding*yrange
	yrangemax = ymax+padding*yrange

    if (yrangemin < ultimate[0]):
	yrangemin = ultimate[0]

    if (yrangemax > ultimate[1]):
	yrangemax = ultimate[1]


    
    return [yrangemin,yrangemax]

# Make a plot (this one is only used for testing)
def mkplot(row,title):
    df = row.df

    t = df.ix[:,' ElapsedTime (sec)']
    p = df.ix[:,' Stroke500mPace (sec/500m)']
    hr = df.ix[:,' HRCur (bpm)']
    end_time = int(df.ix[df.shape[0]-1,'TimeStamp (sec)'])

    fig, ax1 = plt.subplots(figsize=(5,4))

    ax1.plot(t,p,'b-')
    ax1.set_xlabel('Time (h:m)')
    ax1.set_ylabel('(sec/500)')

    yrange = y_axis_range(df.ix[:,' Stroke500mPace (sec/500m)'],
			  ultimate = [85,190])
    plt.axis([0,end_time,yrange[1],yrange[0]])

    ax1.set_xticks(range(1000,end_time,1000))
    ax1.set_yticks(range(185,90,-10))
    ax1.set_title(title)
    plt.grid(True)
    majorFormatter = FuncFormatter(format_pace_tick)
    majorLocator = (5)
    timeTickFormatter = NullFormatter()
	
    ax1.yaxis.set_major_formatter(majorFormatter)

    for tl in ax1.get_yticklabels():
	tl.set_color('b')

    ax2 = ax1.twinx()
    ax2.plot(t,hr,'r-')
    ax2.set_ylabel('Heart Rate',color='r')
    majorTimeFormatter = FuncFormatter(format_time_tick)
    majorLocator = (15*60)
    ax2.xaxis.set_major_formatter(majorTimeFormatter)
    ax2.patch.set_alpha(0.0)
    for tl in ax2.get_yticklabels():
	tl.set_color('r')
    
    plt.subplots_adjust(hspace=0)

    return fig

