# -*- coding: utf-8 -*-
"""
@author: yq
@time: 2024/12/4
@desc: 
"""
import matplotlib

matplotlib.use('Agg')

import gradio as gr

from webui import f_project_is_exist, f_data_upload, engine, f_download_code, f_code_generate, f_get_sheet_data, \
    f_project_load

input_elems = set()
elem_dict = {}

with gr.Blocks() as demo:
    gr.HTML('<h1 ><center><font size="5">Strategy-Flow-Simulation</font></center></h1>')
    gr.HTML('<h2 ><center><font size="2">决策流快速仿真工具</font></center></h2>')
    with gr.Tabs():
        with gr.TabItem("策略仿真"):
            with gr.Row():
                with gr.Column():
                    with gr.Row():
                        project_name = gr.Textbox(label="项目名称", placeholder="请输入不重复的项目名称",
                                                  info="项目名称将会被作为缓存目录名称,如果重复会导致结果被覆盖", scale=5)
                        project_load = gr.Button("加载历史项目", variant="primary", scale=1)

                    with gr.Row():
                        with gr.Column(scale=3):
                            file_data = gr.File(label="策略文档", file_types=[".xlsx"])
                        with gr.Column(scale=1):
                            with gr.Row():
                                sheet_name = gr.Dropdown(label="策略查看", interactive=True,
                                                         info="流程、节点及代码信息查看")
                            with gr.Row():
                                download_demo = gr.DownloadButton(value="./template/demo.xlsx", label="策略文档demo下载",
                                                                  variant="primary", visible=True)

                    with gr.Row():
                        data_upload = gr.Dataframe(visible=False, label="当前上传数据", max_height=300, interactive=False)
                    code_generate = gr.Button("生成模拟代码", variant="primary")

                    input_elems.update(
                        {project_name, sheet_name, file_data, data_upload, code_generate, download_demo, project_load})
                    elem_dict.update(dict(
                        project_name=project_name,
                        sheet_name=sheet_name,
                        file_data=file_data,
                        data_upload=data_upload,
                        code_generate=code_generate,
                        download_demo=download_demo,
                        project_load=project_load
                    ))
                with gr.Column():
                    with gr.Row():
                        generate_progress = gr.Textbox(label="生成进度", scale=4)
                        download_code = gr.DownloadButton(label="代码下载", variant="primary",
                                                          visible=False, scale=1)
                    with gr.Row():
                        code_view = gr.Code(visible=False, language="python", wrap_lines=True, interactive=False)
                    input_elems.update(
                        {generate_progress, download_code, code_view})
                    elem_dict.update(dict(
                        generate_progress=generate_progress,
                        download_code=download_code,
                        code_view=code_view
                    ))

                    engine.add_elems(elem_dict)

                    project_name.change(fn=f_project_is_exist, inputs=input_elems)
                    sheet_name.change(fn=f_get_sheet_data, inputs=input_elems, outputs=[data_upload, code_view])
                    file_data.upload(fn=f_data_upload, inputs=input_elems,
                                     outputs=[data_upload, sheet_name, download_demo, code_view, download_code])
                    code_generate.click(fn=f_code_generate, inputs=input_elems,
                                        outputs=[generate_progress, code_view, download_code])
                    project_load.click(fn=f_project_load, inputs=input_elems,
                                       outputs=[download_demo, file_data, data_upload, sheet_name, code_view,
                                                download_code])
                    download_code.click(fn=f_download_code, inputs=input_elems, outputs=download_code)

            demo.queue(default_concurrency_limit=5)
            demo.launch(share=False, show_error=True, server_name="0.0.0.0", server_port=18067)

if __name__ == "__main__":
    pass