#!/usr/bin/env bash

readlink -f / &> /dev/null || readlink() { greadlink "$@" ; } # for MacOS
MYDIR=$(dirname -- "$(readlink -f -- "$0")")
MYPROG=$(basename -- "$0")
GERRIT_ARTIFACTS=$MYDIR/gerrit/artifacts
REMOTE_GERRIT_ARTIFACTS=$MYDIR/remote-gerrit/artifacts

die() { echo -e "\nERROR:" "$@" ; kill $$ ; exit 1 ; } # error_message

progress() { # message cmd [args]...
    local message=$1 ; shift
    echo -n "$message"
    "$@" &
    local pid=$!
    while kill -0 $pid 2> /dev/null ; do
        echo -n "."
        sleep 2
    done
    echo
    wait "$pid"
}

usage() { # [error_message]
    cat <<-EOF
Usage:
    $MYPROG [--remote-gerrit-account-cache-jar|-r <FILE_PATH>]
            [--gerrit-war|-g <FILE_PATH>]

    This tool runs the functional tests in a Docker environment built
    from the gerritcodereview/gerrit base Docker image.

    The remote-gerrit-account-cache JAR and optionally a Gerrit WAR are
    expected to be in the $GERRIT_ARTIFACTS dir; however, the
     --remote-gerrit-account-cache-jar and --gerrit-war switches may be
     used as helpers to specify which files to copy there.

    Options:
    --help|-h
    --gerrit-war|-g                           path to Gerrit WAR file
    --remote-gerrit-account-cache-jar|-r      path to remote-gerrit-account-cache JAR file
    --preserve                                To preserve the docker setup for debugging

EOF

    [ -n "$1" ] && echo -e "\nERROR: $1" && exit 1
    exit 0
}

check_prerequisite() {
    docker --version > /dev/null || die "docker is not installed"
    docker compose version > /dev/null || die "docker compose is not installed"
}

build_images() {
    docker compose "${COMPOSE_ARGS[@]}" build --quiet
}

execute_tests() {
    docker compose "${COMPOSE_ARGS[@]}" up --detach
    local run_tests_container="$(docker compose "${COMPOSE_ARGS[@]}" ps -q run_tests | \
        xargs docker inspect --format '{{.Name}}' | sed 's|/||')"
    docker cp "$MYDIR"/../../test "$run_tests_container":/
    docker compose "${COMPOSE_ARGS[@]}" exec -T --user=admin run_tests \
        '/test/docker/run_tests/start.sh'
}

get_run_test_container() {
    docker compose "${COMPOSE_ARGS[@]}" ps | grep run_tests | awk '{ print $1 }'
}

cleanup() {
    if [ "$PRESERVE" = "true" ] ; then
        echo "Preserving the following docker setup"
        docker compose "${COMPOSE_ARGS[@]}" ps
        echo ""
        echo "To exec into run_tests container, use following command:"
        echo "docker exec -it $(get_run_test_container) /bin/bash"
        echo ""
        echo "Run the following command to bring down the setup:"
        echo "docker compose" "${COMPOSE_ARGS[@]}" "down -v --rmi local"
    else
        docker compose "${COMPOSE_ARGS[@]}" down -v --rmi local 2>/dev/null
    fi
    rm -rf "$GERRIT_ARTIFACTS" "$REMOTE_GERRIT_ARTIFACTS"
}

PRESERVE="false"
COMPOSE_ARGS=()
while (( "$#" )) ; do
    case "$1" in
        --help|-h)                                usage ;;
        --gerrit-war|-g)                          shift ; GERRIT_WAR=$1 ;;
        --remote-gerrit-account-cache-jar|-r)     shift ; REMOTE_GERRIT_ACCOUNT_CACHE_JAR=$1 ;;
        --preserve)                               PRESERVE="true" ;;
        --compose-arg)                            shift ; COMPOSE_ARGS+=("$1") ;;
        *)                                        usage "invalid argument $1" ;;
    esac
    shift
done

PROJECT_NAME="remote-gerrit-account-cache_$$"
COMPOSE_YAML="$MYDIR/docker-compose.yaml"
COMPOSE_ARGS=(--project-name "$PROJECT_NAME" -f "$COMPOSE_YAML")
check_prerequisite
mkdir -p -- "$GERRIT_ARTIFACTS" "$REMOTE_GERRIT_ARTIFACTS"

[ -n "$REMOTE_GERRIT_ACCOUNT_CACHE_JAR" ] \
    && cp -f -- "$REMOTE_GERRIT_ACCOUNT_CACHE_JAR" "$GERRIT_ARTIFACTS/remote-gerrit-account-cache.jar"
if [ ! -e "$GERRIT_ARTIFACTS/remote-gerrit-account-cache.jar" ] ; then
    MISSING="Missing $GERRIT_ARTIFACTS/remote-gerrit-account-cache.jar"
    [ -n "$REMOTE_GERRIT_ACCOUNT_CACHE_JAR" ] && die "$MISSING, check for copy failure?"
    usage "$MISSING, did you forget --remote-gerrit-account-cache-jar?"
fi

[ -n "$GERRIT_WAR" ] && cp -f -- "$GERRIT_WAR" "$GERRIT_ARTIFACTS/gerrit.war"
[ -n "$GERRIT_WAR" ] && cp -f -- "$GERRIT_WAR" "$REMOTE_GERRIT_ARTIFACTS/gerrit.war"
( trap cleanup EXIT SIGTERM
    progress "Building docker images" build_images
    execute_tests
)
