from os.path import dirname, join
from pandas import *

import numpy as np
import pandas.io.sql as psql
import sqlite3 as sql
import sys, os

from bokeh.plotting import figure
from bokeh.layouts import layout, widgetbox
from bokeh.models import ColumnDataSource, HoverTool, Div
from bokeh.models.widgets import Slider, Select, TextInput, MultiSelect
from bokeh.io import curdoc
import matplotlib.pyplot as plt



files = list()
path = os.getcwd()
for x in os.listdir(path):
 if x.endswith(".xlsx"):
   if x != 'template.xlsx' :
    files.append(x)

axis_map = {
    "0% void": "0% void",
    "40% void": "40% void",
    "70% void": "70% void",
}


files_list = MultiSelect(title="Files", value=["dummy2.xlsx"], options=open(join(dirname(__file__), 'files.txt')).read().split())
voids = MultiSelect(title="At what void[s]", value=["0% void"], options=sorted(axis_map.keys()))




p = figure(plot_height=600, plot_width=700, title="", toolbar_location=None)
pline = figure(plot_height=600, plot_width=700, title="")



path = os.getcwd()
data_dict = {}
for file in os.listdir(path):
 if file.endswith(".xlsx"):
     xls = ExcelFile(file)
     df = xls.parse(xls.sheet_names[0])
     data = df.to_dict()
     data_dict[file] = data

    
# converting dictionary  to dataframe
newdict = {(k1, k2):v2 for k1,v1 in data_dict.items() \
                       for k2,v2 in data_dict[k1].items()}
xxs = DataFrame([newdict[i] for i in sorted(newdict)],
                  index=MultiIndex.from_tuples([i for i in sorted(newdict.keys())]))  
master_data = xxs.transpose()


def select_data():
    for vals in files_list.value:
        for vox in voids.value:
            pline.line(x=master_data[vals]['Burnup'], y=  master_data[vals][vox])
            pline.circle(x=master_data[vals]['Burnup'], y=  master_data[vals][vox])
    return 



def update():
    select_data()

controls = [  files_list, voids]

for control in controls:
    control.on_change('value', lambda attr, old, new: update())

sizing_mode = 'fixed'  # 'scale_width' also looks nice with this example

inputs = widgetbox(*controls, sizing_mode=sizing_mode)
l = layout([
    [inputs, pline],
], sizing_mode=sizing_mode)

update()  # initial load of the data

curdoc().add_root(l)
curdoc().title = "Movies"
