#!/usr/bin/env python3

import argparse
import os.path
import subprocess
import sys


def main():
    parser = argparse.ArgumentParser(description="Publish Docker images")
    parser.add_argument("--image", dest="images", action="append", help="The image to be exported")
    parser.add_argument(
        "--service", default="dockerhub", help="Used repository",
    )
    parser.add_argument(
        "--no-trigger",
        dest="trigger",
        action="store_false",
        help="Disable triggerring OpenShift for an image update",
    )
    args = parser.parse_args()

    ref = os.environ["GITHUB_REF"].split("/")

    if ref[1] != "heads":
        print("Not a branch")
        sys.exit(0)

    version = "/".join(ref[2:])

    if version not in os.environ.get("HELM_RELEASE_NAMES", "").split(","):
        print("Not a release branch")
        sys.exit(0)

    env = {}
    with open(".env") as open_file:
        for line in open_file:
            if line and line[0] != "#":
                try:
                    index = line.index("=")
                    env[line[:index].strip()] = line[index + 1 :].strip()
                except ValueError:
                    # Ignore lines that don't have a '='
                    pass

    print("Deploying images for tag {}".format(version))
    sys.stdout.flush()

    cmd = ["docker", "login"]
    if args.service == "dockerhub":
        login = subprocess.check_output(["gopass", "gs/ci/dockerhub/username"]).decode()
        password = subprocess.check_output(["gopass", "gs/ci/dockerhub/password"])
        prefix = ""
    elif args.service == "github":
        cmd += ["ghcr.io"]
        login = subprocess.check_output(["gopass", "gs/ci/github/username"]).decode()
        password = subprocess.check_output(["gopass", "gs/ci/github/token/gopass"])
        prefix = "ghcr.io/"
    else:
        print("Unknown service '{}'".format(args.service))
        sys.exit(1)

    cmd += ["--username=" + login, "--password-stdin"]
    process = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
    output, output_err = process.communicate(input=password)
    if process.returncode != 0:
        if output:
            print(output.decode())
        if output_err:
            print(output_err.decode())
        sys.exit(1)

    for image in args.images:
        full_image = "{}-{}".format(env.get("DOCKER_BASE", "camptocamp/geomapfish"), image)
        src_image = "{}:{}".format(full_image, env.get("DOCKER_TAG", "latest"))
        dest_image = "{}{}:{}".format(prefix, full_image, version)
        subprocess.check_call(["docker", "tag", src_image, dest_image])
        subprocess.check_call(["docker", "push", dest_image])

    if args.trigger:
        openshift_version = "3.11.0"
        openshift_hash = "0cbc58b"
        openshift_version_name = "openshift-origin-client-tools-v{}-{}-linux-64bit".format(
            openshift_version, openshift_hash
        )
        openshift_file = openshift_version_name + ".tar.gz"
        openshift_url = "https://github.com/openshift/origin/releases/download/v{}/{}".format(
            openshift_version, openshift_file
        )
        subprocess.check_call(["wget", "--quiet", openshift_url], cwd="/tmp")
        subprocess.check_call(["tar", "xfz", openshift_file], cwd="/tmp")
        oc = "/tmp/{}/oc".format(openshift_version_name)  # pylint: disable=invalid-name

        subprocess.check_call(
            [
                oc,
                "login",
                subprocess.check_output(
                    ["gopass", "gs/ci/openshift/{}/url".format(os.environ["OPENSHIFT_PROJECT"])]
                ).decode(),
                "--token="
                + subprocess.check_output(
                    ["gopass", "gs/ci/openshift/{}/token".format(os.environ["OPENSHIFT_PROJECT"])]
                ).decode(),
            ]
        )
        for image in args.images:
            openshift_image_ref = "{version}-c2cgeoportal-{image}:{version}".format(
                version=version, image=image
            )
            subprocess.check_call(
                [
                    oc,
                    "import-image",
                    openshift_image_ref,
                    "--scheduled=true",
                    "--reference-policy=local",
                    "--namespace=" + os.environ["OPENSHIFT_PROJECT"],
                ]
            )


if __name__ == "__main__":
    main()
