#!/usr/bin/env python3

# Copyright 2022 The IREE Authors
#
# Licensed under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
"""Creates an HTML page for releases for `pip install --find-links` from GitHub releases."""
# TODO(#10479) since we're generating this we might as well create a PEP 503
# compliant index
import argparse
import html
import json
import subprocess
import sys
import textwrap

import requests


def parse_arguments():
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "--repo",
        "--repository",
        default="iree-org/iree",
        help="The GitHub repository to fetch releases from.",
    )
    parser.add_argument(
        "--output",
        default="-",
        help="The file to write the HTML to or '-' for stdout (the default)",
    )
    return parser.parse_args()


class ReleaseFetcher:
    def __init__(self, repo, per_page=100):
        self._session = requests.Session()
        self._repo = repo
        self._per_page = per_page

    def get_all(self):
        url = f"https://api.github.com/repos/{self._repo}/releases"
        page = 1

        # GitHub limits API responses to the first 1000 results.
        while page * self._per_page < 1000:
            response = self._session.get(
                url,
                params={
                    "page": page,
                    "per_page": self._per_page,
                },
            )
            for release in response.json():
                yield release
            if "next" not in response.links:
                break
            page += 1


def main(args):
    fetcher = ReleaseFetcher(repo=args.repo)
    with sys.stdout if args.output == "-" else open(args.output, "w") as f:
        f.write(
            textwrap.dedent(
                """\
            <!DOCTYPE html>
            <html>
              <body>
            """
            )
        )
        for release in fetcher.get_all():
            if release["draft"]:
                continue
            for asset in release["assets"]:
                url = html.escape(asset["browser_download_url"])
                name = html.escape(asset["name"])
                f.write(f"    <a href={url}>{name}</a><br />\n")
        f.write(
            textwrap.dedent(
                """\
      </body>
    </html>
    """
            )
        )


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