import logging
import os

import gradio as gr  # type: ignore[import]

from src.content import (
    INTRODUCTION_TEXT,
    INTRODUCTION_TITLE,
    LEADERBOARD_TEXT,
    LEADERBOARD_TITLE,
    SUBMISSION_TEXT_FILES,
    SUBMISSION_TEXT_INTRO,
    SUBMISSION_TEXT_METADATA,
    SUBMISSION_TEXT_SUBMIT,
    SUBMISSION_TEXT_TASK,
    SUBMISSION_TITLE,
)
from src.get_results_for_task import get_results_for_task
from src.leaderboard_formatting import get_types_per_task
from src.submission_uploader import SubmissionUploader
from src.tasks_content import (
    TASKS_DESCRIPTIONS,
    TASKS_PRETTY,
    TASKS_PRETTY_REVERSE,
    get_submission_text_files_for_task,
)

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s",
    handlers=[logging.StreamHandler()],
)

submission_uploader = SubmissionUploader(
    dataset_id=os.environ["DATASET_ID"], private_dataset_id=os.environ["PRIVATE_DATASET_ID"]
)


def get_leaderboard_for_task(task_pretty: str) -> gr.components.Dataframe:
    return gr.components.Dataframe(
        value=get_results_for_task(task_pretty),
        interactive=False,
        datatype=get_types_per_task(TASKS_PRETTY_REVERSE[task_pretty]),
    )

code_completion_dataset_names = get_results_for_task(TASKS_PRETTY['project_code_completion'])['Dataset Name'].unique().tolist()

def get_leaderboard_for_completion_task(dataset_name: str | None):
    df = get_results_for_task(TASKS_PRETTY['project_code_completion'])
    if dataset_name is None:
        dataset_name = code_completion_dataset_names[0]
    filtered_df = df[df['Dataset Name']==dataset_name]
    filtered_df.drop(columns=['Dataset'], inplace=True)
    return gr.components.Dataframe(
        value=filtered_df,
        interactive=False,
        datatype=get_types_per_task('project_code_completion'),
    )


with gr.Blocks() as demo:
    # intro
    gr.HTML(INTRODUCTION_TITLE)
    gr.Markdown(INTRODUCTION_TEXT, elem_classes="markdown-text")

    # leaderboard
    gr.HTML(LEADERBOARD_TITLE)
    gr.Markdown(LEADERBOARD_TEXT, elem_classes="markdown-text")
    with gr.Tabs():
        for task_pretty in TASKS_PRETTY_REVERSE:
            with gr.TabItem(task_pretty):
                with gr.Row():
                    gr.Markdown(TASKS_DESCRIPTIONS[TASKS_PRETTY_REVERSE[task_pretty]])

                if task_pretty == TASKS_PRETTY['project_code_completion']:
                    leaderboard_table = get_leaderboard_for_completion_task(dataset_name=None)
                    
                else:
                    leaderboard_table = get_leaderboard_for_task(task_pretty)
                
                task_input = gr.Text(value=task_pretty, visible=False)

                if task_pretty == TASKS_PRETTY['project_code_completion']:
                    dataset_dropdown = gr.Dropdown(choices=code_completion_dataset_names, label="Select the Dataset")
                    dataset_dropdown.change(
                        fn=get_leaderboard_for_completion_task,
                        inputs=dataset_dropdown,
                        outputs=leaderboard_table
                    )
                    refresh_button = gr.Button("🔄 Refresh", variant="secondary")
                    refresh_button.click(
                        fn=get_leaderboard_for_completion_task,
                        inputs=dataset_dropdown,
                        outputs=leaderboard_table,
                    )
                else:
                    refresh_button = gr.Button("🔄 Refresh", variant="secondary")
                    refresh_button.click(
                        fn=get_leaderboard_for_task,
                        inputs=task_input,
                        outputs=leaderboard_table,
                    )

    # submission
    '''
    gr.HTML(SUBMISSION_TITLE)
    gr.Markdown(SUBMISSION_TEXT_INTRO, elem_classes="markdown-text")
    with gr.Accordion("🚀 Submit new results", open=False):
        gr.Markdown(SUBMISSION_TEXT_TASK, elem_classes="markdown-text")
        task_selection = gr.Radio(TASKS_PRETTY_REVERSE.keys(), label="Task")

        gr.Markdown(SUBMISSION_TEXT_METADATA, elem_classes="markdown-text")
        with gr.Row():
            with gr.Column():
                model_folder_textbox = gr.Textbox(
                    label="Model Folder",
                    placeholder="How to call a folder related to this submission in our results dataset (should be unique).",
                )
                model_name_textbox = gr.Textbox(
                    label="Model Name",
                    placeholder="How to display model's name on the leaderboard.",
                )
                model_url_textbox = gr.Textbox(
                    label="Model URL",
                    placeholder="Link to a model's page - will be clickable on a leaderboard (optional).",
                )

            with gr.Column():
                url_textbox = gr.Textbox(
                    label="Relevant URLs",
                    placeholder='URLs to relevant resources with additional details about your submission (optional). Use the following format: "[text1](link1), [text2](link2)".',
                )
                model_availability_textbox = gr.Textbox(
                    label="Availability",
                    placeholder="Information about the model's availability and licensing.",
                )
                context_size_textbox = gr.Textbox(
                    label="Context Size",
                    placeholder="Context size in tokens used for the submission (should be an integer).",
                )
            with gr.Column():
                submitted_by_textbox = gr.Textbox(
                    label="Submitted By",
                    placeholder="How to display on the leaderboard who submitted the model.",
                )
                contact_textbox = gr.Textbox(
                    label="Contact Information",
                    placeholder="How Long Code Arena team can contact you (won't go to public dataset).",
                )
                comment_textbox = gr.Textbox(
                    label="Comment",
                    placeholder="Any comments you have for Long Code Arena team (optional, won't go to public dataset).",
                )

        gr.Markdown(SUBMISSION_TEXT_FILES, elem_classes="markdown-text")
        with gr.Row():
            with gr.Column(variant="panel"):
                task_specific_instructions = gr.Markdown(get_submission_text_files_for_task(None))
                task_selection.select(get_submission_text_files_for_task, [task_selection], task_specific_instructions)
            with gr.Column():
                file_output = gr.File(file_count="multiple")

        gr.Markdown(SUBMISSION_TEXT_SUBMIT, elem_classes="markdown-text")
        submit_button = gr.Button("Submit")
        submission_result = gr.Markdown()
        submit_button.click(
            submission_uploader.upload_files,
            [
                task_selection,
                model_folder_textbox,
                model_name_textbox,
                model_availability_textbox,
                model_url_textbox,
                url_textbox,
                context_size_textbox,
                submitted_by_textbox,
                contact_textbox,
                comment_textbox,
                file_output,
            ],
            submission_result,
        )
    '''

if __name__ == "__main__":
    demo.queue()
    demo.launch()