#!/bin/bash

set -e

DOCKER_REPO=$1
VERSION=$2
DEBUG=$3
PROG=$(basename $0)

if [ ! -z "$DEBUG" ]; then
    set -x
fi

if [ -z "$VERSION" -o -z "$DOCKER_REPO" ]; then
    echo "USAGE: $PROG <docker-repo> <version>"
    echo "Example: $PROG myservice master-20151112-1222-30-eb2300"
    exit 1
fi

check_git_clean() {
    DIR=$1

    HERE=$PWD
    cd $DIR
    IS_DIRTY_CLONE=$(git status --short --porcelain | wc -l)
    if [ "$IS_DIRTY_CLONE" -gt 0 ]; then
        ROOTDIR=$(git rev-parse --show-toplevel)
        ROOTDIR=$(basename $ROOTDIR)
        echo "ERROR: project $ROOTDIR is not clean! Commit and re-run."
        exit 1
    fi
    cd $HERE
}

check_git_clean '.'

for LINK in $(klue_config --include-links)
do
    check_git_clean $LINK
done

ROOTDIR=$(git rev-parse --show-toplevel)
if [ "$PWD" != "$ROOTDIR" ]; then
    echo "ERROR: current dir is not the clone's root directory"
    exit 1
fi

DOCKERFILE_TEMPLATE=$(get_deploy_config_path)/Dockerfile.template
if [ ! -e "$DOCKERFILE_TEMPLATE" ]; then
    echo "ERROR: cannot find $DOCKERFILE_TEMPLATE"
    exit 1
fi

PROJECT_NAME=$(klue_config --name)
DOCKER_ROOT_REPO=$(klue_config --docker-repo)

CELERY_CMD=''
DO_ASYNC=$(klue_config --with-async)
if [ ! -z "$DO_ASYNC" ]; then
    CELERY_CMD=$(python -c 'import klue_async; print(klue_async.get_celery_cmd(False))' | tail -n 1)
    CELERY_CMD="redis-server \& $CELERY_CMD \& "
fi

echo "=> Taring source with git archive"
mkdir -p docker
git archive -o docker/klue.tar HEAD

if [ -d 'apis' ]; then
    tar -rf docker/klue.tar apis/*.yaml
fi

for LINK in $(klue_config --include-links)
do
    tar --dereference \
        -rf docker/klue.tar \
        --exclude='*.pyc' \
        --exclude='*__pycache__*' \
        $LINK
done

echo "=> Docker image will contain files:"
echo ""
tar -tvf docker/klue.tar
echo ""

echo "=> Generating docker/Dockerfile"
cat $DOCKERFILE_TEMPLATE \
    | sed -e "s|<VERSION>|$VERSION|" \
    | sed -e "s|<START_CELERY>|$CELERY_CMD|" \
    > docker/Dockerfile

# Remove image if it already exists
# TODO: make the cleanup optional, so it can be skipped if no changes to project files
IMAGE_ID=$(docker images --quiet ${DOCKER_REPO}:${VERSION})
if [ ! -z "$IMAGE_ID" ]; then
    echo "=> Deleting cached image"
    docker rmi -f $IMAGE_ID
fi

echo "=> Building docker image"
docker build -t ${DOCKER_REPO}:${VERSION} --rm docker

rm docker/Dockerfile
