import os
import sys
import traceback

import gradio as gr

class Script:
    filename = None

    def title(self):
        raise NotImplementedError()


scripts = []


def load_scripts(basedir, globs):
    for filename in os.listdir(basedir):
        path = os.path.join(basedir, filename)

        if not os.path.isfile(path):
            continue

        with open(path, "r", encoding="utf8") as file:
            text = file.read()

        from types import ModuleType
        compiled = compile(text, path, 'exec')
        module = ModuleType(filename)
        module.__dict__.update(globs)
        exec(compiled, module.__dict__)

        for key, item in module.__dict__.items():
            if type(item) == type and issubclass(item, Script):
                item.filename = path

                scripts.append(item)


def wrap_call(func, filename, funcname, *args, default=None, **kwargs):
    try:
        res = func()
        return res
    except Exception:
        print(f"Error calling: {filename/funcname}", file=sys.stderr)
        print(traceback.format_exc(), file=sys.stderr)

    return default

def setup_ui():
    titles = [wrap_call(script.title, script.filename, "title") for script in scripts]

    gr.Dropdown(options=[""] + titles, value="", type="index")
