import gradio as gr
from pathlib import Path

from modules.interrogate import looks

from shared import state, add_setting, performance_settings, resolution_settings, path_manager, settings, models

def save_clicked(*args):
    ui_data = {}
    # Overwrite current settings
    for key, val in zip(state["setting_name"], args):
        settings.default_settings[key] = val

        # Remove empty keys
        if settings.default_settings[key] == None or settings.default_settings[key] == "":
            settings.default_settings.pop(key)
            continue

        # Massage some of the data. Settings that are lists should be split
        if key in [
            "archive_folders",
            "style",
            "path_checkpoints",
            "path_loras"
        ]:
            settings.default_settings[key] = settings.default_settings[key].splitlines()

        # Move ui_* and path_*
        if key.startswith("ui_"):
            ui_data[key] = settings.default_settings.get(key)
            settings.default_settings.pop(key)
        if key.startswith("path_"):
            path_manager.paths[key] = settings.default_settings.get(key)
            settings.default_settings.pop(key)

    settings.set_settings_path(ui_data.get("ui_settings_name", None))
    settings.save_settings()
    path_manager.set_settings_path(ui_data.get("ui_settings_name", None))
    path_manager.save_paths()

    print(f"Saved new settings to {settings.settings_path}. Please restart.") 
    gr.Info("Saved! Please restart RuinedFoocus.")


def create_settings():
    with gr.Blocks() as app_settings:
        with gr.Row():
            with gr.Column():
                gr.Markdown("# UI settings")
                image_number = gr.Number(label="Image Number", interactive=True, value=settings.default_settings.get("image_number", 1))
                add_setting("image_number", image_number)
                image_number_max = gr.Number(label="Image Number Max", interactive=True, value=settings.default_settings.get("image_number_max", 50))
                add_setting("image_number_max", image_number_max)
                seed_random = gr.Checkbox(label="Seed Random", interactive=True, value=settings.default_settings.get("seed_random", True))
                add_setting("seed_random", seed_random)
                seed = gr.Number(label="Seed", interactive=True, value=settings.default_settings.get("seed", -1))
                add_setting("seed", seed)
                style = gr.Code(
                    label="Style",
                    interactive=True,
                    value="\n".join(settings.default_settings.get("style", [])),
                    lines=5,
                    max_lines=5
                )
                add_setting("style", style)
                prompt = gr.Textbox(label="Prompt", interactive=True, value=settings.default_settings.get("prompt", ""))
                add_setting("prompt", prompt)
                negative_prompt = gr.Textbox(label="Negative Prompt", interactive=True, value=settings.default_settings.get("negative_prompt", ""))
                add_setting("negative_prompt", negative_prompt)
                performance = gr.Dropdown(
                    label="Performance",
                    interactive=True,
                    choices=list(performance_settings.performance_options.keys()),
                    value=settings.default_settings.get("performance", "Speed"),
                )
                add_setting("performance", performance)
                resolution = gr.Dropdown(
                    label="Resolution",
                    interactive=True,
                    choices=list(resolution_settings.aspect_ratios.keys()),
                    value=settings.default_settings.get("resolution", "1344x768 (16:9)"),
                )
                add_setting("resolution", resolution)
                base_model = gr.Dropdown(
                    label="Base Model",
                    interactive=True,
                    choices=models.names['checkpoints'],
                    value=settings.default_settings.get("base_model", "sd_xl_base_1.0_0.9vae.safetensors"),
                )
                add_setting("base_model", base_model)

                with gr.Row():
                    lora_1_model = gr.Dropdown(
                        label="LoRA 1 Model",
                        interactive=True,
                        choices=["None"] + models.names['loras'],
                        value=settings.default_settings.get("lora_1_model", "None"),
                    )
                    lora_1_weight = gr.Number(label="Lora 1 Weight", value=settings.default_settings.get("lora_1_weight", 1.0), step=0.05)
                with gr.Row():
                    lora_2_model = gr.Dropdown(
                        label="LoRA 2 Model",
                        interactive=True,
                        choices=["None"] + models.names['loras'],
                        value=settings.default_settings.get("lora_2_model", "None"),
                    )
                    lora_2_weight = gr.Number(label="Lora 2 Weight", value=settings.default_settings.get("lora_2_weight", 1.0), step=0.05)
                with gr.Row():
                    lora_3_model = gr.Dropdown(
                        label="LoRA 3 Model",
                        interactive=True,
                        choices=["None"] + models.names['loras'],
                        value=settings.default_settings.get("lora_3_model", "None"),
                    )
                    lora_3_weight = gr.Number(label="Lora 3 Weight", value=settings.default_settings.get("lora_3_weight", 1.0), step=0.05)
                with gr.Row():
                    lora_4_model = gr.Dropdown(
                        label="LoRA 4 Model",
                        interactive=True,
                        choices=["None"] + models.names['loras'],
                        value=settings.default_settings.get("lora_4_model", "None"),
                    )
                    lora_4_weight = gr.Number(label="Lora 4 Weight", value=settings.default_settings.get("lora_4_weight", 1.0), step=0.05)
                with gr.Row():
                    lora_5_model = gr.Dropdown(
                        label="LoRA 5 Model",
                        interactive=True,
                        choices=["None"] + models.names['loras'],
                        value=settings.default_settings.get("lora_5_model", "None"),
                    )
                    lora_5_weight = gr.Number(label="Lora 5 Weight", value=settings.default_settings.get("lora_5_weight", 1.0), step=0.05)

                add_setting("lora_1_model", lora_1_model)
                add_setting("lora_2_model", lora_2_model)
                add_setting("lora_3_model", lora_3_model)
                add_setting("lora_4_model", lora_4_model)
                add_setting("lora_5_model", lora_5_model)
                add_setting("lora_1_weight", lora_1_weight)
                add_setting("lora_2_weight", lora_2_weight)
                add_setting("lora_3_weight", lora_3_weight)
                add_setting("lora_4_weight", lora_4_weight)
                add_setting("lora_5_weight", lora_5_weight)

                auto_negative_prompt = gr.Checkbox(label="Auto Negative Prompt", interactive=True, value=settings.default_settings.get("auto_negative_prompt", False))
                add_setting("auto_negative_prompt", auto_negative_prompt)
            with gr.Column():
                gr.Markdown("# One Button Prompt")
                OBP_preset = gr.Textbox(label="OBP Preset", value=settings.default_settings.get("OBP_preset", "Standard"))
                add_setting("OBP_preset", OBP_preset)
                hint_chance = gr.Number(label="Hint Chance", value=settings.default_settings.get("hint_chance", 25))
                add_setting("hint_chance", hint_chance)
                
                gr.Markdown("# Image Browser")
                images_per_page = gr.Number(label="Images per page", value=settings.default_settings.get("images_per_page", 100), minimum=1, maximum=1000, step=1)
                add_setting("images_per_page", images_per_page)
                archive_folders = gr.Code(
                    label="Archive folders",
                    interactive=True,
                    value="\n".join(settings.default_settings.get("archive_folders", [])),
                    lines=5,
                    max_lines=5
                )
                add_setting("archive_folders", archive_folders)
                gr.Markdown("# Paths")
                path_checkpoints = gr.Code(
                    label="Checkpoint folders",
                    interactive=True,
                    value="\n".join(path_manager.paths.get("path_checkpoints", [])),
                    lines=5,
                    max_lines=5
                )
                add_setting("path_checkpoints", path_checkpoints)
                path_loras = gr.Code(
                    label="LoRA folders",
                    interactive=True,
                    value="\n".join(path_manager.paths.get("path_loras", [])),
                    lines=5,
                    max_lines=5
                )
                add_setting("path_loras", path_loras)
                path_inbox = gr.Textbox(label="Inbox folder", interactive=True, placeholder="", value=settings.default_settings.get("path_inbox", "../models/inbox/"))
                add_setting("path_inbox", path_inbox)
                path_outputs = gr.Textbox(label="Output folder", interactive=True, placeholder="", value=settings.default_settings.get("path_outputs", "../outputs/"))
                add_setting("path_outputs", path_outputs)

            with gr.Column():
                gr.Markdown("# Other")
                interrogator = gr.Dropdown(label="Default interrogator", interactive=True, choices=list(looks.keys()), value=settings.default_settings.get("interrogator", None),)
                add_setting("interrogator", interrogator)
                save_metadata = gr.Checkbox(label="Save Metadata", value=settings.default_settings.get("save_metadata", True))
                add_setting("save_metadata", save_metadata)
                theme = gr.Textbox(label="Theme", interactive=True, value=settings.default_settings.get("theme", None))
                add_setting("theme", theme)
                clip_g = gr.Dropdown(label="clip_g", interactive=True, choices=[None]+path_manager.get_folder_list("clip"), value=settings.default_settings.get("clip_g", None),)
                add_setting("clip_g", clip_g)
                clip_t = gr.Dropdown(label="clip_t", interactive=True, choices=[None]+path_manager.get_folder_list("clip"), value=settings.default_settings.get("clip_t", None),)
                add_setting("clip_t", clip_t)
                clip_t5 = gr.Dropdown(label="clip_t5", interactive=True, choices=[None]+path_manager.get_folder_list("clip"), value=settings.default_settings.get("clip_t5", None),)
                add_setting("clip_t5", clip_t5)
                clip_umt5 = gr.Dropdown(label="clip_umt5", interactive=True, choices=[None]+path_manager.get_folder_list("clip"), value=settings.default_settings.get("clip_umt5", None),)
                add_setting("clip_umt5", clip_umt5)
                clip_llava = gr.Dropdown(label="clip_llava", interactive=True, choices=[None]+path_manager.get_folder_list("clip"), value=settings.default_settings.get("clip_llava", None),)
                add_setting("clip_llava", clip_llava)
                clip_vision = gr.Dropdown(label="clip_vision", interactive=True, choices=[None]+path_manager.get_folder_list("clip_vision"), value=settings.default_settings.get("clip_vision", None),)
                add_setting("clip_vision", clip_vision)

                lumina2_shift = gr.Textbox(label="Lumina2 shift", interactive=True, placeholder=3.0, value=settings.default_settings.get("lumina2_shift", None))
                add_setting("lumina2_shift", lumina2_shift)

                vae_flux = gr.Dropdown(label="Flux VAE", interactive=True, choices=[None]+path_manager.get_folder_list("vae"), value=settings.default_settings.get("vae_flux", None),)
                add_setting("vae_flux", vae_flux)
                vae_hunyuan_video = gr.Dropdown(label="Hunyuan Video VAE", interactive=True, choices=[None]+path_manager.get_folder_list("vae"), value=settings.default_settings.get("vae_hunyuan_video", None),)
                add_setting("vae_hunyuan_video", vae_hunyuan_video)
                vae_lumina2 = gr.Dropdown(label="Lumina2 VAE", interactive=True, choices=[None]+path_manager.get_folder_list("vae"), value=settings.default_settings.get("vae_lumina2", None),)
                add_setting("vae_lumina2", vae_lumina2)
                vae_sd3 = gr.Dropdown(label="SD3 VAE", interactive=True, choices=[None]+path_manager.get_folder_list("vae"), value=settings.default_settings.get("vae_sd3", None),)
                add_setting("vae_sd3", vae_sd3)
                vae_sdxl = gr.Dropdown(label="SDXL/Pony/Illustrious VAE", interactive=True, choices=[None]+path_manager.get_folder_list("vae"), value=settings.default_settings.get("vae_sdxl", None),)
                add_setting("vae_sdxl", vae_sdxl)
                vae_wan = gr.Dropdown(label="WAN 2.1 VAE", interactive=True, choices=[None]+path_manager.get_folder_list("vae"), value=settings.default_settings.get("vae_wan", None),)
                add_setting("vae_wan", vae_wan)
                llama_localfile = gr.Dropdown(label="Local Llama file", interactive=True, choices=[None]+path_manager.get_folder_list("llm"), value=settings.default_settings.get("llama_localfile", None),)
                add_setting("llama_localfile", llama_localfile)

        with gr.Row(), gr.Group():
            ui_settings_name = gr.Text(
                label="Settings name",
                interactive=True,
                placeholder="Optional",
                value=settings.name,
            )
            add_setting("ui_settings_name", ui_settings_name)
            save_btn = gr.Button("Save Settings")

# Deal with this later
#            output = gr.Textbox(label="Status")
#            download_file = gr.File(label="Download File")
#        with gr.Row():
#            upload = gr.File(label="Load settings file (optional)", file_count="single", type="filepath")
#            download_btn = gr.Button("Download current settings")


        save_btn.click(
            fn=save_clicked,
            inputs=state["setting_obj"],
            outputs=[
            ]
        )

    return app_settings