import requests


CHAR_REPLACEMENTS: list = [
    ["_", "__"],
    ["-", "--"],
    [" ", "_"],
    ["?", "~q"],
    ["&", "~a"],
    ["%", "~p"],
    ["#", "~h"],
    ["/", "~s"],
    ["\\", "~b"],
    ["<", "~l"],
    [">", "~g"],
    ['"', "''"],
]


def get_templates() -> list[dict]:
    url: str = "https://api.memegen.link/templates"
    req: requests.Response = requests.get(url=url, timeout=5)
    req.raise_for_status()
    data: dict = req.json()
    templates: list = []
    for tmpl in data:
        if tmpl["lines"] != 2:
            continue
        if tmpl["id"] == "oprah":
            tmpl["name"] = "Oprah You Get A..."
        tmpl_ext: str = "gif" if "animated" in tmpl["styles"] else "jpg"
        tmpl_data: dict = {
            "id": tmpl["id"],
            "name": tmpl["name"],
            "ext": tmpl_ext,
            "choiceval": tmpl["id"] + "." + tmpl_ext,
        }
        templates.append(tmpl_data)
    templates = sorted(templates, key=lambda d: d["name"])
    return templates


def format_meme_string(input_string: str) -> str:
    # https://memegen.link/#special-characters
    out_string: str = input_string
    for char_replacement in CHAR_REPLACEMENTS:
        out_string: str = out_string.replace(char_replacement[0], char_replacement[1])
    return out_string


def generate_api_url(template: str, top_str: str, btm_str: str) -> str:
    tmpl_name: str
    tmpl_ext: str
    tmpl_name, tmpl_ext = template.split(".")

    top_str = format_meme_string(top_str)
    btm_str = format_meme_string(btm_str)

    url: str = f"https://api.memegen.link/images/{tmpl_name}/{top_str}/{btm_str}.{tmpl_ext}"
    return url