import gradio as gr
from state import get_settings

app_settings = get_settings()


def on_change_inference_steps(steps):
    app_settings.settings.lcm_diffusion_setting.inference_steps = steps


def on_change_image_width(img_width):
    app_settings.settings.lcm_diffusion_setting.image_width = img_width


def on_change_image_height(img_height):
    app_settings.settings.lcm_diffusion_setting.image_height = img_height


def on_change_num_images(num_images):
    app_settings.settings.lcm_diffusion_setting.number_of_images = num_images


def on_change_guidance_scale(guidance_scale):
    app_settings.settings.lcm_diffusion_setting.guidance_scale = guidance_scale


def on_change_seed_value(seed):
    app_settings.settings.lcm_diffusion_setting.seed = seed


def on_change_seed_checkbox(seed_checkbox):
    app_settings.settings.lcm_diffusion_setting.use_seed = seed_checkbox


def on_change_safety_checker_checkbox(safety_checker_checkbox):
    app_settings.settings.lcm_diffusion_setting.use_safety_checker = (
        safety_checker_checkbox
    )


def on_change_tiny_auto_encoder_checkbox(tiny_auto_encoder_checkbox):
    app_settings.settings.lcm_diffusion_setting.use_tiny_auto_encoder = (
        tiny_auto_encoder_checkbox
    )


def on_offline_checkbox(offline_checkbox):
    app_settings.settings.lcm_diffusion_setting.use_offline_model = offline_checkbox


def get_generation_settings_ui() -> None:
    with gr.Blocks():
        with gr.Row():
            with gr.Column():
                num_inference_steps = gr.Slider(
                    1,
                    25,
                    value=app_settings.settings.lcm_diffusion_setting.inference_steps,
                    step=1,
                    label="Inference Steps",
                    interactive=True,
                )

                image_height = gr.Slider(
                    256,
                    1024,
                    value=app_settings.settings.lcm_diffusion_setting.image_height,
                    step=256,
                    label="Image Height",
                    interactive=True,
                )
                image_width = gr.Slider(
                    256,
                    1024,
                    value=app_settings.settings.lcm_diffusion_setting.image_width,
                    step=256,
                    label="Image Width",
                    interactive=True,
                )
                num_images = gr.Slider(
                    1,
                    50,
                    value=app_settings.settings.lcm_diffusion_setting.number_of_images,
                    step=1,
                    label="Number of images to generate",
                    interactive=True,
                )
                guidance_scale = gr.Slider(
                    1.0,
                    2.0,
                    value=app_settings.settings.lcm_diffusion_setting.guidance_scale,
                    step=0.1,
                    label="Guidance Scale",
                    interactive=True,
                )

                seed = gr.Slider(
                    value=app_settings.settings.lcm_diffusion_setting.seed,
                    minimum=0,
                    maximum=999999999,
                    label="Seed",
                    step=1,
                    interactive=True,
                )
                seed_checkbox = gr.Checkbox(
                    label="Use seed",
                    value=app_settings.settings.lcm_diffusion_setting.use_seed,
                    interactive=True,
                )

                safety_checker_checkbox = gr.Checkbox(
                    label="Use Safety Checker",
                    value=app_settings.settings.lcm_diffusion_setting.use_safety_checker,
                    interactive=True,
                )
                tiny_auto_encoder_checkbox = gr.Checkbox(
                    label="Use tiny auto encoder for SD",
                    value=app_settings.settings.lcm_diffusion_setting.use_tiny_auto_encoder,
                    interactive=True,
                )
                offline_checkbox = gr.Checkbox(
                    label="Use locally cached model or downloaded model folder(offline)",
                    value=app_settings.settings.lcm_diffusion_setting.use_offline_model,
                    interactive=True,
                )

        num_inference_steps.change(on_change_inference_steps, num_inference_steps)
        image_height.change(on_change_image_height, image_height)
        image_width.change(on_change_image_width, image_width)
        num_images.change(on_change_num_images, num_images)
        guidance_scale.change(on_change_guidance_scale, guidance_scale)
        seed.change(on_change_seed_value, seed)
        seed_checkbox.change(on_change_seed_checkbox, seed_checkbox)
        safety_checker_checkbox.change(
            on_change_safety_checker_checkbox, safety_checker_checkbox
        )
        tiny_auto_encoder_checkbox.change(
            on_change_tiny_auto_encoder_checkbox, tiny_auto_encoder_checkbox
        )
        offline_checkbox.change(on_offline_checkbox, offline_checkbox)