import os
import requests
import gradio as gr
from utils import EN_US

ZH2EN = {
    "仓库拥有者": "Repo owner",
    "输入用户名或组织名": "Username / organization name",
    "仓库名": "GitHub repo",
    "输入仓库名": "Repo name",
    "输入 personal access token": "Personal access token",
    "发布标签": "Release tag",
    "发布标题": "Release title",
    "发布描述": "Describe this release",
    "上传发布文件(可多选)": "Binary file(s)",
    "状态栏": "Status",
    "上传文件创建一个新的 GitHub 发布": "Upload binary file(s) to create a new GitHub release.",
}


def _L(zh_txt: str):
    return ZH2EN[zh_txt] if EN_US else zh_txt


def create_github_release(owner, repo, token, tag, name, description, files):
    try:
        # 创建 Release
        response = requests.post(
            f"https://api.github.com/repos/{owner}/{repo}/releases",
            headers={
                "Authorization": f"token {token}",
                "Accept": "application/vnd.github.v3+json",
            },
            json={
                "tag_name": tag,
                "name": name,
                "body": description,
                "draft": False,
                "prerelease": False,
            },
        )

        if response.status_code != 201:
            raise ConnectionError(f"{response.status_code}: {response.json()}")

        # 获取上传 URL
        release = response.json()
        upload_url = release["upload_url"].split("{")[0]

        # 上传多个二进制文件
        results = ""
        for file_path in files:
            file_name = os.path.basename(file_path)
            with open(file_path, "rb") as binary_file:
                upl_response = requests.post(
                    f"{upload_url}?name={file_name}",
                    headers={
                        "Authorization": f"token {token}",
                        "Content-Type": "application/octet-stream",
                    },
                    data=binary_file,
                )

            if upl_response.status_code == 201:
                results += f"Upload '{file_name}' success!"
            else:
                results += f"Failed to upload {file_name}: {upl_response.status_code}, {upl_response.json()}"

        return results

    except Exception as e:
        return f"{e}"


def github_release_creator():
    return gr.Interface(
        fn=create_github_release,
        inputs=[
            gr.Textbox(label=_L("仓库拥有者"), placeholder=_L("输入用户名或组织名")),
            gr.Textbox(label=_L("仓库名"), placeholder=_L("输入仓库名")),
            gr.Textbox(
                label="GitHub Token",
                placeholder=_L("输入 personal access token"),
                type="password",
            ),
            gr.Textbox(label=_L("发布标签"), placeholder="Release tag"),
            gr.Textbox(label=_L("发布标题"), placeholder="Release title"),
            gr.TextArea(
                label=_L("发布描述"),
                placeholder=_L("上传文件创建一个新的 GitHub 发布"),
            ),
            gr.File(label=_L("上传发布文件(可多选)"), file_count="multiple"),
        ],
        outputs=gr.TextArea(label=_L("状态栏"), show_copy_button=True),
        flagging_mode="never",
    )