#!/bin/bash

TOPDIR=$(git rev-parse --show-toplevel)
IMGDIR="$(cd "$(dirname "$0")" && pwd)"

. $TOPDIR/tools/validate-docker-execute

RELEASE_NAMESPACE=kollaglue
NAMESPACE=kollaglue
PREFIX=centos-rdo-
TAG=$(git rev-parse --short HEAD)
RELEASE_TAG=latest
MAX_TRIES=1

usage () {
    cat <<EOF
Usage: $0 [options]

Options:

--prefix <image_prefix>
--private-registry, -r <registry_address[:port]>
--namespace, -n <namespace>
--tag, -t <tag>
--push, -p
--force-rm, -f
--no-cache, -N
--pull, -u
--release
--no-use-released-parent
--retry <number_of_retries>
EOF
}

[ -f $TOPDIR/.buildconf ] && . $TOPDIR/.buildconf
[ -f $IMGDIR/.buildinfo ] && . $IMGDIR/.buildinfo
[ -f $IMGDIR/.buildconf ] && . $IMGDIR/.buildconf

ARGS=$(getopt -o hr:n:t:pfuN -l help,prefix:,namespace:,push,pull,private-registry:,release,tag:,force-rm,no-cache,no-use-released-parent,retry: -- "$@") || { usage >&2; exit 2; }

eval set -- "$ARGS"

while :; do
    case "$1" in

    (--help|-h) usage
                exit 0
                ;;

    (--prefix)  shift
                FORCE_PREFIX="$1"
                ;;

    (--release) MODE=release
                NAMESPACE=$RELEASE_NAMESPACE
                TAG=$RELEASE_TAG
                ;;

    (--tag|-t)  shift
                TAG="$1"
                ;;

    (--push|-p) PUSH=1
                ;;

    (--pull|-u) BUILDFLAGS="${BUILDFLAGS} --pull=true"
                ;;

    (--force-rm|-f)
                BUILDFLAGS="${BUILDFLAGS} --force-rm=true"
                ;;

    (--no-cache|-N)
                BUILDFLAGS="${BUILDFLAGS} --no-cache"
                ;;

    (--private-registry|-r)
                shift
                REGISTRY="$1"
                ;;

    (--namespace|-n)
                shift
                NAMESPACE="$1"
                ;;

    (--no-use-released-parent)
                USE_CURRENT_TAG=1
                ;;

    (--retry)
                shift
                MAX_TRIES=$((MAX_TRIES + $1))
                ;;

    (--)        break
                ;;

    esac

    shift
done

if [[ $USE_CURRENT_TAG = 1 ]]; then
    PARENT_TAG=$TAG
else
    PARENT_TAG=$RELEASE_TAG
fi

if [ "$NAMESPACE" = "$RELEASE_NAMESPACE" ] \
    && [ "$TAG" = "$RELEASE_TAG" ] \
    && ! [ "$MODE" = "release" ]; then

    echo "ERROR: use --release to build a release image" >&2
    exit 1
fi

if [[ -n "${PREFIX}" && -n "${FORCE_PREFIX}" ]]; then
    PREFIX="${FORCE_PREFIX}"
fi


if [[ -n $REGISTRY ]]; then
    NAMESPACE="${REGISTRY}/${NAMESPACE}"
fi

IMAGE="${PREFIX}${IMGDIR##*/}"
FULLIMAGE="${NAMESPACE}/${IMAGE}${TAG:+:${TAG}}"

cat <<EOF
======================================================================
$FULLIMAGE
======================================================================

EOF

if [ "$MODE" = "release" ]; then
    echo "*** YOU ARE BUILDING A RELEASE IMAGE ***"
    echo
fi

TMPDIR=$(mktemp -d /tmp/kolla-build.XXXXXXXXXX)
cp -aL $IMGDIR/* $TMPDIR
# Use an extension for in-place editing for portability, as GNU and BSD
# versions of sed behave differently otherwise
sed -i.bak "s|%%KOLLA_NAMESPACE%%|${NAMESPACE}|g" $TMPDIR/Dockerfile
sed -i.bak "s|%%KOLLA_PREFIX%%|${PREFIX}|g" $TMPDIR/Dockerfile
sed -i.bak "s|%%KOLLA_TAG%%|${PARENT_TAG}|g" $TMPDIR/Dockerfile

if [[ "${SOURCE_INSTALL_AVAILABLE}" == "1" ]]; then
    . ${TOPDIR}/tools/gen-source-tar.sh
fi

TRY=0
while [ $((MAX_TRIES - 1)) -gt $TRY ]; do
    if docker build ${BUILDFLAGS} -t "$FULLIMAGE" $TMPDIR; then
        break
    else
        echo "WARNING: failed to build $FULLIMAGE, retrying..."
        TRY=$((TRY + 1))
    fi
done

if ! docker build ${BUILDFLAGS} -t "$FULLIMAGE" $TMPDIR; then
    echo "ERROR: failed to build $FULLIMAGE"
    exit 1
fi

rm -rf $TMPDIR

echo "Built: $FULLIMAGE"

if [ "$PUSH" = 1 ]; then
    if ! docker push "$FULLIMAGE"; then
        echo "ERROR: failed to push $FULLIMAGE"
        exit 1
    fi

    echo "Pushed: $FULLIMAGE"
fi