# -*- coding: utf-8 -*-
"""
Spyder Editor

This is a temporary script file.
"""

from Modules.dataseries import dataseries
import numpy as np
import pandas as pd
import calendar
import datetime


crop = 'Gasoline'
month = 'Jul'
curyear = 2019
position = 'long'
abbr_to_num = {name: num for num, name in enumerate(calendar.month_abbr) if num}
monthnum = abbr_to_num[month]
daysofyear = []
idx = []
curyeardate = []
maxduration = 14 # max number of days for trade
startdate = []
enddate = []
out = []
loopcount = 0

# build array of all days of year

for i in range(350):
    day = datetime.date(curyear,monthnum,15) + datetime.timedelta(i)
    daysofyear.append(day.strftime('%m-%d'))
    idx.append(int(i))
    curyeardate.append(day)

posentry = pd.DataFrame({'Day':daysofyear}).join(pd.DataFrame({'Idx':idx})).join(pd.DataFrame({'Date':curyeardate}))
posexit = pd.DataFrame({'Day':daysofyear}).join(pd.DataFrame({'Idx':idx})).join(pd.DataFrame({'Date':curyeardate}))
posentry = posentry.set_index(['Day'])
posexit = posexit.set_index(['Day'])

for year in range(2006,2019):
    df = dataseries(crop, month, year).dataseries
    df['Day'] = pd.to_datetime(df['Date']).dt.strftime('%m-%d')
    df[str(year) + '-Date'] = pd.to_datetime(df['Date']).dt.strftime('%Y-%m-%d')
    df = df.set_index(['Day'])
    del df['Date'], df['Open'], df['High'], df['Low']
    df.columns = [year, str(year) + '-Date']
    posentry = posentry.join(df, how='outer')
    posentry[year] = posentry[year].fillna(method='bfill').fillna(method='ffill')
    posentry[str(year) + '-Date'] = posentry[str(year) + '-Date'].fillna(method='bfill').fillna(method='ffill')
    posexit = posexit.join(df, how='outer')
    posexit[year] = posexit[year].fillna(method='ffill').fillna(method='bfill')
    posexit[str(year) + '-Date'] = posexit[str(year) + '-Date'].fillna(method='ffill').fillna(method='bfill')
    
posentry = posentry.set_index(['Idx'])
posexit = posexit.set_index(['Idx'])

for column in posentry:
    if posentry[column].dtype == np.float64:
        for i in range(len(posentry)):
            for j in range(i+1,i+maxduration):
                if j <= 349: 
#                    if posentry['Date'][i].weekday() <= 4 and posentry['Date'][j].weekday() <= 4:
                    startdate.append(str(posentry['Date'][i].month) + '-' + str(posentry['Date'][i].day))
                    enddate.append(str(posexit['Date'][j].month) + '-' + str(posexit['Date'][j].day))
                    if position == 'short':
                        diff = posentry[column][i] - posexit[column][j]  # Short
                    else:
                        diff = posexit[column][j] - posentry[column][i]   # Long
                    if diff <= 0:
                        win = 0
                    else:
                        win = 1
                    out.append(diff)
                
        df_yr = pd.DataFrame({'Start':startdate}).join(pd.DataFrame({'End':enddate})).join(pd.DataFrame({column:out}))
        df_yr = df_yr.set_index(['Start', 'End'])
        
        if loopcount == 0:
            data = df_yr
        else:
            data = data.join(df_yr, how='outer')
        
        loopcount+=1
        out = []
        del df_yr
        startdate = []
        enddate = []

data['mean'] = data.mean(axis=1)
data['winrate'] = (data.select_dtypes(include='float64').gt(0).sum(axis=1)-1)/(data.count(axis=1) - 1)
data['count'] = data.count(axis=1) - 2

data = data.query("winrate >= 0.80 and mean > 0 and (Start == '4-17' or Start == '4-18' or Start == '4-19')")
data = data.reset_index()

