from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals

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

import numpy as np
from rowers.rows import format_pace_tick, format_pace, format_time, format_time_tick 


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


# 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.loc[:,' ElapsedTime (sec)']
    p = df.loc[:,' Stroke500mPace (sec/500m)']
    hr = df.loc[:,' HRCur (bpm)']
    end_time = int(df.loc[:,'TimeStamp (sec)'].iloc[df.shape[0]-1])

    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.loc[:,' 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

