__all__ = ['block', 'make_clickable_model', 'make_clickable_user', 'get_submissions']

import gradio as gr
import pandas as pd
import json
import pdb
import tempfile

from constants import *
from src.auto_leaderboard.model_metadata_type import ModelType
from src.compute import compute_scores

global data_component, filter_component


def upload_file(files):
    file_paths = [file.name for file in files]
    return file_paths

def add_new_eval(
    input_file,
    model_name_textbox: str,
    revision_name_textbox: str,
    model_link: str,
):
    if input_file is None:
        return "Error! Empty file!"
    else:
        input_file = compute_scores(input_file)
        input_data = input_file[1]
        input_data = [float(i) for i in input_data]

        csv_data = pd.read_csv(CSV_DIR)

        if revision_name_textbox == '':
            col = csv_data.shape[0]
            model_name = model_name_textbox
            name_list = [name.split(']')[0][1:] if name.endswith(')') else name for name in csv_data['Model']]
            print(name_list)
            print(model_name)
            assert model_name not in name_list
        else:
            model_name = revision_name_textbox
            model_name_list = csv_data['Model']
            name_list = [name.split(']')[0][1:] if name.endswith(')') else name for name in model_name_list]
            if revision_name_textbox not in name_list:
                col = csv_data.shape[0]
            else:
                col = name_list.index(revision_name_textbox)

        if model_link == '':
            model_name = model_name  # no url
        else:
            model_name = '[' + model_name + '](' + model_link + ')'

        # add new data
        new_data = [
            model_name,
            input_data[0],
            input_data[1],
            input_data[2],
            input_data[3],
            input_data[4],
            input_data[5],
            input_data[6],
            input_data[7],
            input_data[8],
            input_data[9],
            input_data[10],
            input_data[11],
            input_data[12],
            input_data[13],
            input_data[14],
            input_data[15],
            input_data[16],
            ]
        csv_data.loc[col] = new_data 
        # with open(f'./file/{model_name}.json','w' ,encoding='utf-8') as f:
        #     json.dump(new_data, f)  
        csv_data.to_csv(CSV_DIR, index=False)
    return 0

def get_baseline_df():
    # pdb.set_trace()
    df = pd.read_csv(CSV_DIR)
    df = df.sort_values(by="Avg. All", ascending=False)
    present_columns = MODEL_INFO + checkbox_group.value
    df = df[present_columns]
    return df

def get_all_df():
    df = pd.read_csv(CSV_DIR)
    df = df.sort_values(by="Avg. All", ascending=False)
    return df

block = gr.Blocks()


with block:
    gr.Markdown(
        LEADERBORAD_INTRODUCTION
    )
    with gr.Tabs(elem_classes="tab-buttons") as tabs:
        with gr.TabItem("🏅 Video Benchmark", elem_id="video-benchmark-tab-table", id=0):
            with gr.Row():
                with gr.Accordion("Citation", open=False):
                    citation_button = gr.Textbox(
                        value=CITATION_BUTTON_TEXT,
                        label=CITATION_BUTTON_LABEL,
                        elem_id="citation-button",
                    ).style(show_copy_button=True)
    
            gr.Markdown(
                TABLE_INTRODUCTION
            )

            # selection for column part:
            checkbox_group = gr.CheckboxGroup(
                choices=TASK_INFO_v2,
                value=AVG_INFO,
                label="Select options",
                interactive=True,
            )

            # 创建数据帧组件
            data_component = gr.components.Dataframe(
                value=get_baseline_df, 
                headers=COLUMN_NAMES,
                type="pandas", 
                datatype=DATA_TITILE_TYPE,
                interactive=False,
                visible=True,
                )
    
            def on_checkbox_group_change(selected_columns):
                # pdb.set_trace()
                selected_columns = [item for item in TASK_INFO_v2 if item in selected_columns]
                present_columns = MODEL_INFO + selected_columns
                updated_data = get_all_df()[present_columns]
                updated_data = updated_data.sort_values(by=present_columns[1], ascending=False)
                updated_headers = present_columns
                update_datatype = [DATA_TITILE_TYPE[COLUMN_NAMES.index(x)] for x in updated_headers]

                filter_component = gr.components.Dataframe(
                    value=updated_data, 
                    headers=updated_headers,
                    type="pandas", 
                    datatype=update_datatype,
                    interactive=False,
                    visible=True,
                    )
                # pdb.set_trace()
        
                return filter_component.value

            # 将复选框组关联到处理函数
            checkbox_group.change(fn=on_checkbox_group_change, inputs=checkbox_group, outputs=data_component)
        '''
        # table 2
        with gr.TabItem("📝 About", elem_id="seed-benchmark-tab-table", id=2):
            gr.Markdown(LEADERBORAD_INFO, elem_classes="markdown-text")
        '''
        # table 3 
        with gr.TabItem("🚀 Submit here! ", elem_id="seed-benchmark-tab-table", id=3):
            gr.Markdown(LEADERBORAD_INTRODUCTION, elem_classes="markdown-text")

            with gr.Row():
                gr.Markdown(SUBMIT_INTRODUCTION, elem_classes="markdown-text")

            with gr.Row():
                gr.Markdown("# ✉️✨ Submit your model evaluation json file here!", elem_classes="markdown-text")

            with gr.Row():
                with gr.Column():
                    model_name_textbox = gr.Textbox(
                        label="Model name", placeholder="Chat-UniVi-7B"
                        )
                    revision_name_textbox = gr.Textbox(
                        label="Revision Model Name", placeholder="Chat-UniVi-7B"
                    )
                    model_link = gr.Textbox(
                        label="Model Link", placeholder="https://github.com/PKU-YuanGroup/Chat-UniVi"
                    )

            with gr.Column():

                input_file = gr.File(label="Click to Upload a json File", type='binary')
                submit_button = gr.Button("Submit Eval")
    
                submission_result = gr.Markdown()
                submit_button.click(
                    add_new_eval,
                    inputs=[
                        input_file,
                        model_name_textbox,
                        revision_name_textbox,
                        model_link,
                    ],
                    # outputs = submission_result,
                )

    with gr.Row():
        data_run = gr.Button("Refresh")
        data_run.click(
            get_baseline_df, outputs=data_component
        )

    # block.load(get_baseline_df, outputs=data_title)

block.launch()