 
import pandas as pd
import datetime
import numpy as np
import plotly as pl
import plotly.graph_objs as go
import matplotlib.pyplot as plt
import math
import scipy
import random
import statistics 


import datetime 
import matplotlib.dates as mdates
import matplotlib.pyplot as plt

import mplfinance as mpf

import plotly
#import plotly.plotly as py
import plotly.graph_objs as go
# these two lines allow your code to show up in a notebook
from plotly.offline import init_notebook_mode, iplot
from plotly.subplots import make_subplots
init_notebook_mode()

import market_trade.core.CoreTraidMath
import plotly.express as px




class agrigateFig():
    
    def __init__(self,data=[],needDraw=False ,subplot_titles=None):
        self.data=data
        self.ans=self.getAgrPlt()
        if needDraw:
            self.subplot_titles=subplot_titles
            self.fig=coreDraw(self.ans,True,self.subplot_titles)
        
        
    def getAgrPlt(self):
        count=0
        ans=[]
        for i in self.data:
            count=count+1
            if type(i)==list:
                for  g in i:
                    for j in g.figDict:
                        ans.append(j)
                        ans[-1]['row']=count
            else:
                for j in i.figDict:
                    ans.append(j)
                    ans[-1]['row']=count
        return ans


class corePlt():
    def __init__(self, params={
        'vtype':'',
        'df':pd.DataFrame(),
        'row':1,
        'col':1,
        'name':''
    }):
        self.vtype=params['vtype']
        self.df=params['df']
        self.row=params['row']
        self.col=params['col']
        self.name=params['name']
        if 'colorType' in params.keys():
            self.colorType=params['colorType']
        




class coreDraw():
    def __init__(self, data=[],needShow=False):
        self.data=self.getPlts(data)
        self.needShow=needShow
        self.ans=self.getAns()
        
        
    

    
    
    
    def getBarColorList(self,l,colorType):
        if colorType=='diffAbs':
            ans=['green']
            for i in range(1,len(l)):
                if abs(l[i])>abs(l[i-1]):
                    ans.append('green')
                else:
                    ans.append('red')
        elif colorType=='diff':
            ans=['green']
            for i in range(1,len(l)):
                if (l[i])>(l[i-1]):
                    ans.append('green')
                else:
                    ans.append('red')
        elif colorType=='normal':
            ans=[]
            for i in range(len(l)):
                ans.append('gray')
        return ans
    
    def getPlts(self, data):
        ans=None
        
        if type(data)==list:
            ans=[]
            for i in data:
                ans.append(corePlt(i))
        else:
            ans=[corePlt(data)]
        
        
        
        
        return ans
    
    def getAns(self):
        '''
        data list
            vtype
            df
            row=1
            col=1
            name
        
        
        
        '''
        
        ans=None
        
        
        
       
        maxRow=1
        maxCol=1
        for i in self.data:
            if i.row > maxRow:
                maxRow =i.row
            if i.col > maxCol:
                maxCol =i.col
                
        fig = make_subplots(
            rows=maxRow,
            cols=maxCol,
            shared_xaxes=True,
            vertical_spacing=0.02,
            shared_yaxes=True,
            horizontal_spacing=0.02,
            #column_widths=[]
        
        )
        
        
        fig.update_layout(xaxis_rangeslider_visible=False)
        fig.update_layout(barmode='relative')
        
        for i in self.data:
            if i.vtype=='Scatter':
                fig.add_trace(go.Scatter(x=i.df['date'],y=i.df['value'],name=i.name), row=i.row, col=i.col)
            elif i.vtype=='OCHL':
                fig.add_trace(go.Candlestick(
                        x=i.df['date'],
                        open=i.df['open'],
                        high=i.df['high'],
                        low=i.df['low'],
                        close=i.df['close'],
                        name=i.name),
                              row=i.row, col=i.col
                        )
            elif i.vtype=='Bars':
                for j in i.df.keys():
                    if j!='date':
                        try:
                            colorType=i.colorType
                        except:
                            colorType='normal'
                        colors=self.getBarColorList(i.df[j],colorType)
                        fig.add_trace(go.Bar(x=i.df['date'], y=i.df[j],name=j,marker_color=colors))
                
        
        
        
        ans=fig
        if self.needShow:
            plotly.offline.iplot(fig)
        return ans
