import random
import tempfile

import gradio as gr

from main import create_code_gif


def _create_code_gif(
    code: str,
    style_name: str = "monokai",
    start_color: str = "#FF6B6B",
    end_color: str = "#4ECDC4",
    title: str = "Code GIF",
    favicon: str = "https://huggingface.co/front/assets/huggingface_logo-noborder.svg",
    photo: str = "https://photo.jpg",
    aspect_ratio: float = 16 / 9,
):
    # Convert hex colors to RGB tuples
    def parse_color(color: str) -> tuple:
        if color.startswith("rgba"):
            # Extract numbers from rgba(r, g, b, a) format
            values = color.strip("rgba()").split(",")
            return tuple(int(float(x)) for x in values[:3])  # Only use RGB values
        else:
            # Handle hex colors
            return tuple(int(color.lstrip("#")[i : i + 2], 16) for i in (0, 2, 4))

    start_rgb = parse_color(start_color)
    end_rgb = parse_color(end_color)

    with tempfile.NamedTemporaryFile(suffix=".gif", delete=False) as tmp:
        create_code_gif(
            code=code,
            output_file=tmp.name,
            style=style_name,
            gradient_start=start_rgb,
            gradient_end=end_rgb,
            line_numbers=False,
            title=title,
            filename="code.py",
            favicon=favicon,
            photo=photo,
            aspect_ratio=aspect_ratio,
        )
        return tmp.name


code_placeholder = """
def main():
    print("Hello, World!")


if __name__ == "__main__":
    main()
"""


# Create Gradio interface
def get_random_color():
    return f"#{random.randint(0, 0xFFFFFF):06x}"


start_color = get_random_color()
end_color = get_random_color()

with gr.Blocks(title="Python Code GIF Generator") as demo:
    gr.Markdown("# Python Code GIF Generator")
    gr.Markdown("Generate animated code GIFs with customizable styles and effects")

    with gr.Row():
        with gr.Column():
            gr.Markdown("### Input Settings")
            code = gr.Code(
                label="Code", lines=10, language="python", value=code_placeholder
            )
            title = gr.Textbox(
                label="Title", value="Code GIF", placeholder="My animated code"
            )
            with gr.Row(variant="compact"):
                style = gr.Dropdown(
                    choices=[
                        "monokai",
                        "dracula",
                        "nord-darker",
                        "gruvbox-dark",
                        "solarized-dark",
                        "one-dark",
                        "github-dark",
                        "material",
                        "zenburn",
                        "vs-dark",
                        "tomorrow-night",
                        "paraiso-dark",
                        "native",
                        "fruity",
                        "vim",
                    ],
                    label="Style",
                    value="monokai",
                )
                aspect_ratio = gr.Dropdown(
                    label="Aspect Ratio",
                    choices=[("Portrait (9:16)", 9 / 16), ("Landscape (16:9)", 16 / 9)],
                    value=9 / 16,
                    type="value",
                )
            with gr.Row(variant="compact"):
                start_color_picker = gr.ColorPicker(
                    label="Start Color", value=start_color
                )
                end_color_picker = gr.ColorPicker(label="End Color", value=end_color)
                refresh_colors = gr.Button("Refresh Colors")
            with gr.Row():
                photo = gr.Textbox(
                    label="Photo",
                    value="https://www.indiewire.com/wp-content/uploads/2017/10/matrix-code.jpg",
                    placeholder="https://www.indiewire.com/wp-content/uploads/2017/10/matrix-code.jpg",
                )
                favicon = gr.Textbox(
                    label="Favicon",
                    value="https://huggingface.co/front/assets/huggingface_logo-noborder.svg",
                    placeholder="https://huggingface.co/front/assets/huggingface_logo-noborder.svg",
                )
            with gr.Row():
                submit_btn = gr.Button("Generate GIF")

        # Right column - Output display
        with gr.Column():
            gr.Markdown("### Generated Output")
            output_image = gr.Image(label="Generated GIF", type="filepath")

    submit_btn.click(
        fn=_create_code_gif,
        inputs=[
            code,
            style,
            start_color_picker,
            end_color_picker,
            title,
            favicon,
            photo,
            aspect_ratio,
        ],
        outputs=output_image,
    )
    gr.on(
        [refresh_colors.click, demo.load],
        fn=lambda: (get_random_color(), get_random_color()),
        inputs=[],
        outputs=[start_color_picker, end_color_picker],
    )


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