#!/usr/bin/python3

archs = ["amd64", "i386"]

suffixes = {}
suffixes["lmde2"] = "betsy"
suffixes["lmde3"] = "cindy"
suffixes["lmde4"] = "debbie"
suffixes["lmde5"] = "elsie"
suffixes["lmde6"] = "faye"
suffixes["lmde7"] = "gigi"
suffixes["mint18"] = "sarah"
suffixes["mint19"] = "tara"
suffixes["mint19.1"] = "tessa"
suffixes["mint19.2"] = "tina"
suffixes["mint19.3"] = "tricia"
suffixes["mint20"] = "ulyana"
suffixes["mint20.1"] = "ulyssa"
suffixes["mint20.2"] = "uma"
suffixes["mint20.3"] = "una"
suffixes["mint21"] = "vanessa"
suffixes["mint21.1"] = "vera"
suffixes["mint21.2"] = "victoria"
suffixes["mint21.3"] = "virginia"
suffixes["mint22"] = "wilma"
suffixes["mint22.1"] = "xia"
suffixes["mint22.2"] = "zara"
suffixes["mint22.3"] = "zena"

# Releases which only support 64-bit
only_64bit_releases = ["mint20", "mint20.1", "mint20.2", "mint20.3", "mint21", "mint21.1", "mint21.2", "mint21.3", "mint22", "mint22.1", "mint22.2", "mint22.3", "lmde7"]

import sys
import os
import argparse

def call(command, exit_on_failure=True):
    return_code = os.system(command)
    if return_code != 0 and exit_on_failure:
        print("ERROR: '%s' exited with return code %d" % (command, return_code))
        sys.exit(1)

parser = argparse.ArgumentParser(description='Build packages via Docker')
parser.add_argument("-d", "--distributions", help="Distributions (comma separated)", default="mint19,lmde3")
parser.add_argument("-b", "--bash", action="store_true", help="Open a bash shell just before installing build dependencies (to troubleshoot)")
parser.add_argument("-u", "--update", action="store_true", help="Perform a dist-upgrade before building (needed when the pkg base isn't fully ready yet)")
parser.add_argument("-n", "--without-suffix", help="No suffix", action='store_true', required=False)
parser.add_argument("-r", "--romeo", help="Enable the Romeo repository", action='store_true', required=False)
parser.add_argument("-g", "--git-repositories", help="Git clone URLs, or project names (for Mint projects on Github) (comma separated). . Suffix each repo with #tagname or #branchname to specify a branch or a tag to build from.", required=False)
parser.add_argument("-c", "--without-install", help="No installation of the packages.", action='store_true', required=False)
args = parser.parse_args()

distributions = args.distributions.split(",")
repositories = args.git_repositories.split(",")

# Clean up
if os.path.exists("docker-output"):
    os.system("rm -rf docker-output")

if os.path.exists("docker-output.tar"):
    os.system("rm -f docker-output.tar")

current_dir = os.getcwd()
project_dir = current_dir.split("/")[-1]
parent_dir = "/".join(current_dir.split("/")[:-1])

ssh_options = ""
ssh_dir = os.path.expanduser("~/.ssh")
if os.path.exists(ssh_dir):
    ssh_options = "-v %s:/host_ssh" % ssh_dir

for distribution in distributions:
    for arch in archs:
        if arch == "i386" and distribution in only_64bit_releases:
            continue
        docker_image = "linuxmintd/%s-%s" % (distribution, arch)
        container = "mintbuild-%s-%s" % (distribution, arch)
        print("---------------------------------------------")
        print(" CONTAINER: %s" % container)
        print("---------------------------------------------")

        # Build commands (to be run in docker)
        commands = []
        if os.path.exists(ssh_dir):
            commands.append("cp -R /host_ssh /root/.ssh")
        commands.append("cp /host_bin/mint-build /usr/bin/mint-build")
        if args.romeo:
            commands.append("sed -i 's/import backport/import backport romeo/' /etc/apt/sources.list.d/*.list")
        commands.append("apt-get update")
        if args.update:
            commands.append("apt-get dist-upgrade --yes")
        commands.append("apt-get install --yes openssh-client")
        for repository in repositories:
            if args.bash:
                mintbuild = "mint-build -b -g %s" % repository
            else:
                mintbuild = "mint-build -g %s" % repository
            if not args.without_suffix:
                mintbuild = "%s -s +%s" % (mintbuild, suffixes[distribution])
            if not args.without_install:
                mintbuild = f"{mintbuild} -i"
            # If only a name is given, assume the URL is on Linux Mint's github
            if "#" in repository:
                repository = repository.split("#")[0]
            project_name = repository
            if "://" in repository or "@" in repository:
                project_name = repository.split("/")[-1].replace(".git", "")
            commands.append(mintbuild)
            commands.append("cp %s/*_* /volume_out || cp %s/%s/*_* /volume_out"  % (project_name, project_name, project_name))

        # Create the output directory
        output_directory = os.path.join(os.getcwd(), "docker-output", docker_image.replace("/", "_"))
        call("mkdir -p %s" % output_directory)

        # Kill mintbuild container
        call("docker stop %s" % container, exit_on_failure=False)
        call("docker rm %s" % container, exit_on_failure=False)

        # Recreate the container
        call("docker pull %s" % docker_image)
        call("docker run -it -v /usr/bin:/host_bin %(ssh_options)s -v %(parent_dir)s:/volume_in -v %(output_directory)s:/volume_out --name %(container)s -h %(container)s -d %(image)s"  % {'ssh_options':ssh_options, 'parent_dir': parent_dir, 'output_directory': output_directory, 'image': docker_image, 'container': container})

        # Fix permissions
        #os.system("sudo chown -R `whoami`:`whoami` %s" % output_directory)

        for command in commands:
            print("---------------------------------------------")
            print(" RUNNING: %s" % command)
            print("---------------------------------------------")
            call("docker exec -e COLUMNS=\"`tput cols`\" -e LINES=\"`tput lines`\" -it %s /bin/sh -c \"%s\"" % (container, command))

# Clean up
os.chdir("docker-output")
for dir_name in os.listdir("."):
    if os.path.isdir(dir_name) and dir_name.startswith("linuxmintd_"):
        name = dir_name.replace("linuxmintd_", "")
        (distribution, arch) = name.split("-")
        if arch == "amd64":
            os.system("mkdir -p %s" % distribution)
            os.system("mv %s/* %s/" % (dir_name, distribution))
            os.system("rmdir %s" % dir_name)
        else:
            os.system("mkdir -p %s" % distribution)
            os.system("mv %s %s/i386" % (dir_name, distribution))

os.chdir("..")
os.system("tar cvf docker-output.tar docker-output")
