#!/bin/python3

# A simple script to clean caches matching a PR ID.
#
# Expects a GitHub token in the environment variables as GITHUB_TOKEN.

import json
import os
import sys
import time
from urllib.error import HTTPError, URLError

from urllib.request import Request, urlopen

URL = "https://api.github.com/repos/ClementTsang/bottom/actions/caches"


def cache_list_request(key):
    request = Request(URL, method="GET")
    request.add_header("Accept", "application/vnd.github+json")
    request.add_header("Authorization", "Bearer {}".format(key))
    return request


def delete_cache_request(key, id):
    request = Request("{}/{}".format(URL, id), method="DELETE")
    request.add_header("Accept", "application/vnd.github+json")
    request.add_header("Authorization", "Bearer {}".format(key))
    return request


def main():
    args = sys.argv
    env = os.environ

    key = env["GITHUB_TOKEN"]
    if args[1].isnumeric():
        pr_id = int(args[1])
        ref = "refs/pull/{}/merge".format(pr_id)

        print("Clearing any caches generated by PR {}".format(pr_id))
        with urlopen(cache_list_request(key)) as response:
            response = json.load(response)
            caches = response["actions_caches"]
            for cache in caches:
                if cache["ref"] == ref:
                    id = cache["id"]
                    try:
                        print("Deleting ID {}...".format(id))
                        urlopen(delete_cache_request(key, id))
                    except HTTPError as e:
                        print("HTTPError with delete, error code {}.".format(e.code))
                    except URLError as _:
                        print("URLError with delete.")
                    else:
                        print("Successfully deleted cache ID {}!".format(id))
                    time.sleep(0.1)
    elif args[1] == "keep-main" or args[1] == "keep-master":
        print("Clearing all but default branch cache.")
        with urlopen(cache_list_request(key)) as response:
            response = json.load(response)
            caches = response["actions_caches"]
            for cache in caches:
                if not ("master" in cache["ref"] or "main" in cache["ref"]):
                    id = cache["id"]
                    try:
                        print("Deleting ID {}...".format(id))
                        urlopen(delete_cache_request(key, id))
                    except HTTPError as e:
                        print("HTTPError with delete, error code {}.".format(e.code))
                    except URLError as _:
                        print("URLError with delete.")
                    else:
                        print("Successfully deleted cache ID {}!".format(id))
                    time.sleep(0.1)
    elif args[1] == "main" or args[1] == "master" or args[1] == "all":
        print("Clearing all caches.")
        with urlopen(cache_list_request(key)) as response:
            response = json.load(response)
            caches = response["actions_caches"]
            for cache in caches:
                id = cache["id"]
                try:
                    print("Deleting ID {}...".format(id))
                    urlopen(delete_cache_request(key, id))
                except HTTPError as e:
                    print("HTTPError with delete, error code {}.".format(e.code))
                except URLError as _:
                    print("URLError with delete.")
                else:
                    print("Successfully deleted cache ID {}!".format(id))
                time.sleep(0.1)
    else:
        print(f"Skipping, given argument {args[1]}.")


if __name__ == "__main__":
    main()
