#!/usr/bin/env python3

import glob
import json
import requests
import sys

MATRIX = []

RELEASES = sorted([r.split("/")[-1] for r in glob.glob("images/openstack/releases/*")])
PROJECTS = sorted([r.split("/")[-1] for r in glob.glob("images/openstack/projects/*")])

DATA = {}

if sys.argv[1] == "promote":
    for release in RELEASES:
        for project in PROJECTS:
            ref = (
                open(f"images/openstack/projects/{project}/{release}/ref", "r")
                .read()
                .strip()
            )

            r = requests.get(
                f"https://quay.io/api/v1/repository/vexxhost/{project}/tag/?specificTag={release}"
            )
            tags = r.json().get("tags")
            if len(tags) == 0:
                MATRIX += [
                    {
                        "release": release,
                        "project": project,
                    }
                ]
            sha1_manifest_digest = tags[0].get("manifest_digest")

            r = requests.get(
                f"https://quay.io/api/v1/repository/vexxhost/{project}/tag/?specificTag={ref}"
            )
            tags = r.json().get("tags")
            release_manifest_digest = tags[0].get("manifest_digest")

            if release_manifest_digest != sha1_manifest_digest:
                MATRIX += [
                    {
                        "release": release,
                        "project": project,
                    }
                ]
elif sys.argv[1] == "build":
    for release in RELEASES:
        for project in PROJECTS:
            ref = (
                open(f"images/openstack/projects/{project}/{release}/ref", "r")
                .read()
                .strip()
            )

            r = requests.get(
                f"https://quay.io/api/v1/repository/vexxhost/{project}/tag/?specificTag={ref}"
            )

            if r.json().get("tags") == []:
                MATRIX += [
                    {
                        "release": release,
                        "project": project,
                    }
                ]


if len(MATRIX) != 0:
    DATA = {
        "fail-fast": False,
        "matrix": {
            "include": MATRIX,
        },
    }
json.dump(DATA, sys.stdout, separators=(",", ":"))
