#!/bin/bash

# Copyright (C) 2018 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http:#www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

usage() {
    me=`basename "$0"`
    echo >&2 "Usage: $me [--help] [--tag TAG] [--no-cache] [--gerrit-url URL] [--base-image IMAGE] [IMAGE]"
    exit 1
}

while test $# -gt 0 ; do
  case "$1" in
  --help)
    usage
    ;;

  --no-cache)
    NO_CACHE=true
    shift
    ;;

  --tag)
    shift
    TAG=$1
    shift
    ;;

  --gerrit-url)
    shift
    GERRIT_WAR_URL=$1
    shift
    ;;

  --healthcheck-jar-url)
    shift
    HEALTHCHECK_JAR_URL=$1
    shift
    ;;

  --base-image)
    shift
    BASE_IMAGE=$1
    shift
    ;;

  *)
    break
  esac
done

#Get list of images
source container-images/publish_list
IMAGES=$(get_image_list)

DOCKER_BUILD_OPTS="--platform=linux/amd64"
test -n "$NO_CACHE" && DOCKER_BUILD_OPTS="$DOCKER_BUILD_OPTS --no-cache"

if test -n "$GERRIT_WAR_URL"; then
    BUILD_ARGS="--build-arg GERRIT_WAR_URL=$GERRIT_WAR_URL"
fi

if test -n "$HEALTHCHECK_JAR_URL"; then
    BUILD_ARGS="$BUILD_ARGS --build-arg HEALTHCHECK_JAR_URL=$HEALTHCHECK_JAR_URL"
fi

export REV="$(./get_version.sh --output K8SGERRIT)"

docker_build(){
    IMAGE=$1

    docker build \
        $DOCKER_BUILD_OPTS \
        --build-arg TAG=$REV \
        -t k8sgerrit/$IMAGE:$TAG \
        ./container-images/$IMAGE

    if test $? -ne 0; then
        REPORT="$REPORT Failed: k8sgerrit/$IMAGE.\n"
        RETURN_CODE=1
    else
        REPORT="$REPORT Success: k8sgerrit/$IMAGE:$TAG\n"
    fi
}

docker_build_gerrit_base(){
    BUILD_ARGS="$BUILD_ARGS --build-arg TAG=$REV"
    docker build \
        $DOCKER_BUILD_OPTS \
        $BUILD_ARGS \
        -t gerrit-base:$REV \
        ./container-images/gerrit-base
    if test $? -ne 0; then
        echo -e "\n\nFailed to build gerrit-base image."
        exit 1
    fi

    if test -z "$TAG"; then
        export TAG="$(./get_version.sh)"
    fi
}

REPORT="Build results: \n"
RETURN_CODE=0

if test -n "$BASE_IMAGE"; then
    BASE_BUILD_ARGS="--build-arg BASE_IMAGE=$BASE_IMAGE"
fi

docker build $DOCKER_BUILD_OPTS $BASE_BUILD_ARGS -t base:$REV ./container-images/base
if test $? -ne 0; then
    echo -e "\n\nFailed to build base image."
    exit 1
fi

if test $# -eq 0 ; then
    docker_build_gerrit_base
    for IMAGE in $IMAGES; do
        docker_build $IMAGE
    done
else
    while test $# -gt 0 ; do
        if [[ $1 = gerrit-* ]]; then
            docker_build_gerrit_base
        else
            if test -z "$TAG"; then
                TAG="$REV-unknown"
            fi
            echo -e "\nNo Image containing Gerrit will be built." \
                    "The Gerrit-version can thus not be determinded." \
                    "Using tag $TAG\n"
        fi
        docker_build $1
        shift
    done
fi

echo -e "\n\n$REPORT"
exit $RETURN_CODE
