#!/bin/bash
#
# Copyright (c) 2021 The Flatcar Maintainers.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

set -euo pipefail

cd $(dirname "$0")
source sdk_lib/sdk_container_common.sh

arch="all"
name=""

os_version="$(get_git_version)"
sdk_version="$(get_sdk_version_from_versionfile)"
custom_image=""
tty=""
remove=""
cleanup=""

usage() {
    echo "  Usage:"
    echo "  $0 [-t] [-v <version>] [-V sdk version] [-a arch] [-n <name> ] [-x <script>] [-C custom-container] [-F] [--rm] [container-command]"
    echo "       Start an SDK container of a given SDK release version."
    echo "       This will create the container if it does not exist, otherwise start the existing container."
    echo "       If the container is already running then it will exec into the container."
    echo
    echo "      container-command - command to be run in the container instead of"
    echo "                     an interactive shell."
    echo "      -t             Attach docker to a TTY (docker -t)"
    echo "      -v <version> - Sourcetree (OS image) version to use."
    echo "                     Defaults to '$os_version' (current git commit)."
    echo "                     FLATCAR_VERSION[_ID] in '$sdk_container_common_versionfile'"
    echo "                     will be updated accordingly (also see -F)."
    echo "      -V <SDK ver> - SDK version to use. Defaults to '${sdk_version}'"
    echo "                     (FLATCAR_SDK_VERSION from '$sdk_container_common_versionfile')."
    echo "      -a <amd64|arm64|all> - Target architecture (board support) of the SDK."
    echo "                     'all' (the default) contains support for both amd64 and arm64."
    echo "      -n <name>    - Custom name to use for the container."
    echo "      --rm           Remove container afterwards"
    echo "      -x <script>  - For each resource generated during build (container etc.)"
    echo "                     add a cleanup line to <script> which, when run, will free"
    echo "                     the resource. Useful for CI."
    echo "      -C           - Use an entirely custom container image instead of the SDK's"
    echo "                     $sdk_container_common_registry/flatcar-sdk-[ARCH]:[SDK VERSION]"
    echo "                     Useful for CI."
    echo "      -h             Print this help."
    echo
}
# --

while [ 0 -lt $# ] ; do
    case "$1" in
    -h) usage; exit 0;;
    --help) usage; exit 0;;
    -t) tty="-t";                  shift;;
    -v) os_version="$2";    shift; shift;;
    -V) sdk_version="$2";   shift; shift;;
    -a) arch="$2";          shift; shift;;
    -n) name="$2";          shift; shift;;
    --rm) remove=true;             shift;;
    -x) cleanup="$2";       shift; shift;;
    -C) custom_image="$2";  shift; shift;;
    *) break;;
    esac
done

if [ -n "$custom_image" ] ; then
    container_image_name="${custom_image}"
else
    docker_sdk_vernum="$(vernum_to_docker_image_version "${sdk_version}")"
    container_image_name="$sdk_container_common_registry/flatcar-sdk-${arch}:${docker_sdk_vernum}"
fi

create_versionfile "$sdk_version" "$os_version"

if [ -z "$name" ] ; then
    docker_sdk_vernum="$(vernum_to_docker_image_version "${sdk_version}")"
    docker_os_vernum="$(vernum_to_docker_image_version "${os_version}")"
    name="flatcar-sdk-${arch}-${docker_sdk_vernum}_os-${docker_os_vernum}"
fi

filter="^/"
if "${is_podman}"; then
  filter=""
fi
stat="$($docker ps --all --no-trunc --filter name="${filter}$name\$" --format '{{.Status}}'\
        | cut -f1 -d' ')"

# pass SDK related environment variables and gcloud auth
#  into container
setup_sdk_env
setup_gsutil

mkdir -p "__build__/images"
mkdir -p "sdk_container/.cache/sdks"

hostname="${name:0:63}"
hostname="${hostname//./_}"

if [ -n "$cleanup" ] ; then
    echo "$docker container rm -f '${name}'" >> "$cleanup"
fi

if [ -z "$stat" ] ; then
    yell "Creating a new container '$name'"

    gpg_volumes=$(gnupg_ssh_gcloud_mount_opts)

    if [ -z "$custom_image" ]; then
	(
            source ci-automation/ci_automation_common.sh
            docker_image_from_registry_or_buildcache "flatcar-sdk-${arch}" "${docker_sdk_vernum}"
	)
    fi

    $docker create $tty -i \
       -v /dev:/dev \
       -v "$(pwd)/sdk_container:/mnt/host/source/" \
       -v "$(pwd)/sdk_container/git-override/.git-coreos-overlay:/mnt/host/source/src/third_party/coreos-overlay/.git" \
       -v "$(pwd)/sdk_container/git-override/.git-portage-stable:/mnt/host/source/src/third_party/portage-stable/.git" \
       -v "$(pwd)/__build__/images:/mnt/host/source/src/build" \
       -v "$(pwd):/mnt/host/source/src/scripts" \
       $gpg_volumes \
       --privileged \
       --network host \
       -e SDK_USER_ID="$(id -u)" \
       -e SDK_GROUP_ID="$(id -g)" \
       --name="$name" \
       --hostname="$hostname" \
       "${container_image_name}"
fi

if [ "$stat" != "Up" ] ; then
    yell "Starting stopped container '$name'"
    if [ "${remove}" = "true" ]; then
      remove_command="$docker rm -f $name"
    else
      remove_command=":"
    fi
    trap "$docker stop -t 0 $name ; ${remove_command}" EXIT
    $docker start "$name"
fi

# Workaround: The SDK expects to be able to write to /etc/hosts
$docker exec "$name" sh -c 'cp /etc/hosts /etc/hosts2; umount /etc/hosts ; mv /etc/hosts2 /etc/hosts'

$docker exec $tty -i "$name" /home/sdk/sdk_entry.sh "$@"
