#!/usr/bin/env bash
set -e
#set -x

NC_VERSION=${NC_VERSION:-18}
LOCAL_IMAGE=xaicorp/nextcloud
TAG=${NC_VERSION}.0-${BUILD_NUMBER:-dev}
REMOTE_IMAGE=dkregistry.xai-corp.net:5000/${LOCAL_IMAGE}:${TAG}
STACK_NAME=xaibox
SERVICE_NAME=app
APP_NAME=${STACK_NAME}_${SERVICE_NAME}

LOG=$(mktemp)

#export LOCAL_IMAGE
export REMOTE_IMAGE
#export TAG

export DOCKER_HOST=${DOCKER_HOST:-'dkhost:2376'}

###

function rollback() {
#  docker service inspect ${APP_NAME}
  docker service update --rollback "${APP_NAME}"

  wait_for_completed
#  docker service scale "${APP_NAME}=2"
}

wait_for_completed() {
  #states supported: "rollback_completed", "updating", "completed"
  state=$(docker service inspect ${APP_NAME} | jq -r .[0].UpdateStatus.State)
  while [ "rollback_completed" != "$state"  ]; do
    echo "$state"
    sleep 3
    state=$(docker service inspect ${APP_NAME} | jq -r .[0].UpdateStatus.State)
  done
}

function rollback_test() {
  docker service ps --filter "desired-state=Healthy" ${APP_NAME}

  docker ps | grep "${APP_NAME}"
}

function rollback_save() {
  echo TODO
}


function trap_exit() {
  code=$?
  docker service ls | grep ${APP_NAME}
  if [ $code -gt 0 ]; then
    echo
    rm "$LOG"
    echo -e "\033[31mFailed rolling back ${APP_NAME} \033[39m"
    exit $code
  fi

  rm "$LOG"
  echo -e "\033[32mSuccess:\033[39m ${APP_NAME} successfully rolled back"
}
trap  trap_exit EXIT

print_usage() {
  printf "Usage: %s: [-b] [-t] [-s] \n" "$0"
  echo -r rollback
  echo -t smoke tests
  echo -s tag as latest
  echo -h help
  exit 0
}

######
if [ -z "$1" ]; then
  rollback && rollback_test && rollback_save
  exit
fi

while getopts tdhs name
do
    case $name in
    d)    rollback;;
    t)    rollback_test;;
    s)    rollback_save;;
    *)    print_usage;;
    esac
done
