import gradio as gr
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import csv
from scipy.stats import wilcoxon
import matplotlib.gridspec as gridspec

LIBRARIES = ["7764", 
                 "250833", 
                 #"278964"
                 "734943", 
                 #"1304532",
                 #"1714548", 
                 "2009901",
                 "2670515", 
                 "3828396",
                 "3836952", 
                 "4456656", 
                 "5261717",
                 "6206924", 
                 "7071551", 
                 "7128869",
                 "7603319",
                 "7776928", 
                 "10152778",
                 "10171263", 
                 "10171270", 
                 "10171280",
                 "10174980", 
                 "12450835",
                 "12584701",
                 "12894267",
                 "14052249",
                 "14976868", 
                 "15502567",
                 "19921167",  
                 "21149814", 
                 "23285197", 
                 "28419588",
                 "28644964",  
                 "28847821", "ALOY", "APSTUD", "CLI", "CLOV", "COMPASS", "CONFCLOUD", "CONFSERVER", "DAEMON", "DM", "DNN", "DURACLOUD", "EVG", "FAB", 
             "MDL", "MESOS" ,"MULE", "NEXUS", "SERVER", "STL", "TIDOC", "TIMOB", "TISTUD", "XD", ]

def grafico(list_output_MbR, list_output_NEOSP, list_output_TFIDF, nome_projeto, pip_choices):
    list_results = [["MbR Regressor", np.mean(list_output_MbR)], ["NEOSP-SVR Regressor", np.mean(list_output_NEOSP)], ["TFIDF-SVR Regressor", np.mean(list_output_TFIDF)]]
    
    df = pd.DataFrame(list_results, columns=["Model", "MAE"])
    
    df_list_output_MbR = pd.DataFrame(list_output_MbR, columns=["MAE"])
    df_list_output_NEOSP = pd.DataFrame(list_output_NEOSP, columns=["MAE"])
    df_list_output_TFIDF = pd.DataFrame(list_output_TFIDF, columns=["MAE"])
        
    fig, ax = plt.subplots(2, 2)
    
    G = gridspec.GridSpec(2, 2)
    axes_1 = plt.subplot(G[0, :])
    axes_2 = plt.subplot(G[1, 0])
    axes_3 = plt.subplot(G[1, 1])
    
    # ax1
    axes_1.set_xlabel("Index Execução")
    axes_1.set_ylabel("MAE")
    axes_1.legend()
    axes_1.grid(True, which = "both", axis = "x" )
    axes_1.minorticks_on()
    if "MbR Regressor" in pip_choices:
        axes_1.scatter(range(1,51), df_list_output_MbR["MAE"].loc[1:50],  label="MbR Regressor", color="red", alpha=0.5,)
    if "NEOSP-SVR Regressor" in pip_choices:
        axes_1.scatter(range(1,51), df_list_output_NEOSP["MAE"].loc[1:50], label="NEOSP-SVR Regressor", color = "blue",  alpha=0.5)
    if "TFIDF-SVR Regressor" in pip_choices:
        axes_1.scatter(range(1,51), df_list_output_TFIDF["MAE"].loc[1:50], label="TFIDF-SVR Regressor", color = "green",  alpha=0.5)

    # ax2
    axes_2.set_ylabel("MAE Médio")
    axes_2.set_xlabel("Modelos")
    if "MbR Regressor" in pip_choices:
        graf1 = axes_2.bar(df["Model"].iloc[[0]], df["MAE"].iloc[[0]], color="red", alpha=0.5)
        axes_2.bar_label(graf1, fmt="%.03f", size=10, label_type="edge")    
    if "NEOSP-SVR Regressor" in pip_choices:
        graf2 = axes_2.bar(df["Model"].iloc[[1]], df["MAE"].iloc[[1]], color = "blue",  alpha=0.5)
        axes_2.bar_label(graf2, fmt="%.03f", size=10, label_type="edge")
    if "TFIDF-SVR Regressor" in pip_choices:
        graf3 = axes_2.bar(df["Model"].iloc[[2]], df["MAE"].iloc[[2]], color = "green",  alpha=0.5)
        axes_2.bar_label(graf3, fmt="%.03f", size=10, label_type="edge")
    
    # ax3
    axes_3.set_xlabel("MAE")
    axes_3.set_ylabel("Frequência")
    if "MbR Regressor" in pip_choices:
        axes_3.hist(df_list_output_MbR["MAE"], color="red",  alpha=0.5)
    if "NEOSP-SVR Regressor" in pip_choices:
        axes_3.hist(df_list_output_NEOSP["MAE"], color="blue", alpha=0.5)
    if "TFIDF-SVR Regressor" in pip_choices:
        axes_3.hist(df_list_output_TFIDF["MAE"], color="green", alpha=0.5)
            
    # graficos geral
    fig.set_figwidth(15)
    fig.set_figheight(8)
    fig.suptitle("Projeto {}".format(nome_projeto))
    # text
        
    resultado, resultado2 = "", ""
    #if  (pip_choices == ["NEOSP-SVR Regressor", "MbR Regressor"]) or (pip_choices == ["MbR Regressor", "NEOSP-SVR Regressor"]):
    res = wilcoxon(list_output_NEOSP, list_output_MbR)
    resultado = "NEOSP-SVR vs. MbR => Statistics: {} | valor-p: {}".format(res.statistic, res.pvalue)
    #if  (pip_choices == ["NEOSP-SVR Regressor", "MbR Regressor"]) or (pip_choices == ["MbR Regressor", "NEOSP-SVR Regressor"]):
    res = wilcoxon(list_output_NEOSP, list_output_TFIDF)
    resultado2 = "NEOSP-SVR vs. TFIDF-SVR  => Statistics: {} | valor-p: {}".format(res.statistic, res.pvalue)
    
    res = wilcoxon(list_output_TFIDF, list_output_MbR)
    resultado3 = "TFIDF-SVR vs. MbR  => Statistics: {} | valor-p: {}".format(res.statistic, res.pvalue)
    
    return gr.update(value=plt, visible=True), gr.update(value=resultado, visible=True), gr.update(value=resultado2, visible=True), gr.update(value=resultado3, visible=True)

def create_pip_plot(libraries, pip_choices):
    nome_projeto = libraries
    list_output_MbR = []
    with open("metricas/metricas_{}_MbR.csv".format(nome_projeto), "r") as arquivo:
        arquivo_csv = csv.reader(arquivo)
        for i, linha in enumerate(arquivo_csv):
            list_output_MbR.append(float(linha[0]))
    list_output_NEOSP_SVR = []
    with open("metricas/metricas_{}_NEOSP_SVR.csv".format(nome_projeto), "r") as arquivo:
        arquivo_csv = csv.reader(arquivo)
        for i, linha in enumerate(arquivo_csv):
            list_output_NEOSP_SVR.append(float(linha[0]))
    list_output_TFIDF_SVR = []
    with open("metricas/metricas_{}_TFIDF.csv".format(nome_projeto), "r") as arquivo:
        arquivo_csv = csv.reader(arquivo)
        for i, linha in enumerate(arquivo_csv):
            list_output_TFIDF_SVR.append(float(linha[0]))
    
    return grafico(list_output_MbR, list_output_NEOSP_SVR, list_output_TFIDF_SVR, nome_projeto, pip_choices)
    
demo = gr.Blocks()

with demo:
    with gr.Row():
        with gr.Column():
            gr.Markdown("## Conjunto de Dados")
            libraries = gr.Dropdown(choices=LIBRARIES, label="Projeto", value="ALOY")
        with gr.Column():
            gr.Markdown("## Gráficos")
            pip = gr.CheckboxGroup(choices=["MbR Regressor", "NEOSP-SVR Regressor", "TFIDF-SVR Regressor"], label="Modelos Preditivos")
            # stars = gr.CheckboxGroup(choices=["Stars", "Week over Week"], label="")
            # issues = gr.CheckboxGroup(choices=["Issue", "Exclude org members", "week over week"], label="")
    with gr.Row():
        fetch = gr.Button(value="Fetch")
    with gr.Row():
        with gr.Column():
            star_plot = gr.Text(visible=False, label="Wilcoxon Test")
            star_plot2 = gr.Text(visible=False, label="Wilcoxon Test")
            star_plot3 = gr.Text(visible=False, label="Wilcoxon Test")
            pip_plot = gr.Plot(visible=False)
            
            # issue_plot = gr.Plot(visible=False)

    fetch.click(create_pip_plot, inputs=[libraries, pip], outputs=[pip_plot, star_plot, star_plot2, star_plot3])
    #fetch.click(create_star_plot, inputs=[libraries, pip], outputs=star_plot)
    # fetch.click(create_issue_plot, inputs=[libraries, issues], outputs=issue_plot)

demo.launch()