import os
import re
import requests
import sys
import textwrap

from html import escape

def clean_line(line: str, in_code_fence: bool) -> str:
    line = re.sub(r"\(\[(#\d+)\]\([\w|\d\:|\/|\.|\-|_]*\)\)", lambda match: f"[{match.group(1)}]", line)
    line = re.sub(r"\[(#\d+)\]\([\w|\d\:|\/|\.|\-|_]*\)", lambda match: f"[{match.group(1)}]", line)
    if not in_code_fence:
        line = line.strip()

    return escape(line)


def convert_body(body: str) -> str:
    formatted = ""

    in_code_fence = False
    in_list = False
    for line in body.splitlines():
        line = clean_line(line, in_code_fence)
        if not line:
            continue
        if re.search(r'\[[\w|\d|:|\/|\.|\-|_]*\]\([\w|\d|:|\/|\.|\-|_]*\)', line):
            continue
        line = re.sub(r"(?<!\`)`([^`\n]+)`(?!`)", lambda match: f"<code>{match.group(1)}</code>", line)

        contains_code_fence = bool(re.search(r"```", line))
        is_list = bool(re.search(r"^-\s*", line))

        if in_list and not is_list:
            formatted += "</ul>\n"
        if (not in_code_fence and contains_code_fence) or (not in_list and is_list):
            formatted += "<ul>\n"
        in_list = is_list
        in_code_fence = contains_code_fence != in_code_fence

        if is_list:
            line = re.sub(r"^-\s*", "", line)
            line = f"    <li>{line}</li>"
        elif in_code_fence or contains_code_fence:
            line = f"    <li><code>    {line}</code></li>"
        else:
            line = f"<p>{line}</p>"
        formatted += f"{line}\n"

        if (not in_code_fence and contains_code_fence):
            formatted += "</ul>\n"
    if in_code_fence or in_list:
        formatted += "</ul>\n"
    return formatted

def get_release_info(tag: str):
    url = f"https://api.github.com/repos/zed-industries/zed/releases/tags/{tag}"
    response = requests.get(url)
    if response.status_code == 200:
        return response.json()
    else:
        print(f"Failed to fetch release info for tag '{tag}'. Status code: {response.status_code}")
        quit()


if __name__ == "__main__":
    os.chdir(sys.path[0])

    if len(sys.argv) != 3:
        print("Usage: python convert-release-notes.py <tag> <channel>")
        sys.exit(1)

    tag = sys.argv[1]
    channel = sys.argv[2]

    release_info = get_release_info(tag)
    body = convert_body(release_info["body"])
    version = tag.removeprefix("v").removesuffix("-pre")
    date = release_info["published_at"]

    release_info_str = f"<release version=\"{version}\" date=\"{date}\">\n"
    release_info_str += f"    <description>\n"
    release_info_str += textwrap.indent(body, " " * 8)
    release_info_str += f"    </description>\n"
    release_info_str += f"    <url>https://github.com/zed-industries/zed/releases/tag/{tag}</url>\n"
    release_info_str += "</release>\n"

    channel_releases_file = f"../../crates/zed/resources/flatpak/release-info/{channel}"
    with open(channel_releases_file) as f:
        old_release_info = f.read()
    with open(channel_releases_file, "w") as f:
        f.write(textwrap.indent(release_info_str, " " * 8) + old_release_info)
    print(f"Added release notes from {tag} to '{channel_releases_file}'")
