#! /usr/bin/env python

import argparse
import os
import subprocess as sp


def setup_parser():
    """ Setup the cli arguments """
    parser = argparse.ArgumentParser(prog="pagure-test")
    parser.add_argument(
        "test_case", nargs="?", default="", help="Run the given test case"
    )
    parser.add_argument(
        "--fedora",
        action="store_true",
        help="Run the tests in fedora environment (DEFAULT)",
    )
    parser.add_argument(
        "--centos",
        action="store_true",
        help="Run the tests in centos environment",
    )
    parser.add_argument(
        "--pip",
        action="store_true",
        help="Run the tests in a venv on a Fedora host",
    )
    parser.add_argument(
        "--skip-build",
        dest="skip_build",
        action="store_false",
        help="Skip building the container image",
    )
    parser.add_argument(
        "--shell",
        dest="shell",
        action="store_true",
        help="Gives you a shell into the container instead "
        "of running the tests",
    )

    return parser


if __name__ == "__main__":
    parser = setup_parser()
    args = parser.parse_args()

    if args.centos is True:
        container_names = ["pagure-c7-rpms-py2"]
        container_files = ["centos7-rpms-py2"]
    elif args.fedora is True:
        container_names = ["pagure-f29-rpms-py3"]
        container_files = ["f29-rpms-py3"]
    elif args.pip is True:
        container_names = ["pagure-fedora-pip-py3"]
        container_files = ["fedora-pip-py3"]
    else:
        container_names = [
            "pagure-f29-rpms-py3",
            "pagure-c7-rpms-py2",
            "pagure-fedora-pip-py3",
        ]
        container_files = [
            "f29-rpms-py3",
            "centos7-rpms-py2",
            "fedora-pip-py3",
        ]

    failed = []
    for idx, container_name in enumerate(container_names):
        if args.skip_build is not False:
            print("------ Building Container Image -----")
            output_code = sp.call(
                [
                    "podman",
                    "build",
                    "--build-arg",
                    "branch={}".format(os.environ.get("BRANCH") or "master"),
                    "--build-arg",
                    "repo={}".format(
                        os.environ.get("REPO")
                        or "https://pagure.io/pagure.git"
                    ),
                    "--rm",
                    "-t",
                    container_name,
                    "-f",
                    "dev/containers/%s" % container_files[idx],
                    "dev/containers",
                ]
            )
            if output_code:
                print("Failed building: %s", container_name)
                break

        result_path = "{}/results_{}".format(os.getcwd(), container_files[idx])
        if not os.path.exists(result_path):
            os.mkdir(result_path)

        if args.shell:
            print("--------- Shelling in the container --------------")
            command = [
                "podman",
                "run",
                "-it",
                "--rm",
                "--name",
                container_name,
                "-v",
                "{}/results_{}:/pagure/results:z".format(
                    os.getcwd(), container_files[idx]
                ),
                "-e",
                "BRANCH={}".format(os.environ.get("BRANCH") or "master"),
                "-e",
                "REPO={}".format(
                    os.environ.get("REPO") or "https://pagure.io/pagure.git"
                ),
                "--entrypoint=/bin/bash",
                container_name,
            ]
            sp.call(command)
        else:
            print("--------- Running Test --------------")
            command = [
                "podman",
                "run",
                "-it",
                "--rm",
                "--name",
                container_name,
                "-v",
                "{}/results_{}:/pagure/results:z".format(
                    os.getcwd(), container_files[idx]
                ),
                "-e",
                "BRANCH={}".format(os.environ.get("BRANCH") or "master"),
                "-e",
                "REPO={}".format(
                    os.environ.get("REPO") or "https://pagure.io/pagure.git"
                ),
                "-e",
                "TESTCASE={}".format(args.test_case or ""),
                container_name,
            ]
            output_code = sp.call(command)
            if output_code:
                failed.append(container_name)

    if not args.shell:
        print("\nSummary:")
        if not failed:
            print("  ALL TESTS PASSED")
        else:
            print("  %s TESTS FAILED:" % len(failed))
            for fail in failed:
                print("    - %s" % fail)
