#!/usr/bin/env bash
set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x

has_tty() {
  if [[ "$(/usr/bin/tty || true)" == "not a tty" ]]; then
    return 1
  else
    return 0
  fi
}

dokku_log_info1() {
  echo "-----> $@"
}

dokku_log_info2() {
  echo "=====> $@"
}

dokku_log_info1_quiet() {
  if [[ -z "$DOKKU_QUIET_OUTPUT" ]];then
    echo "-----> $@"
  else
    return 0
  fi
}

dokku_log_info2_quiet() {
  if [[ -z "$DOKKU_QUIET_OUTPUT" ]];then
    echo "=====> $@"
  else
    return 0
  fi
}

dokku_col_log_info1() {
  printf "%-25s %-25s %-25s %-25s\n" "-----> $@"
}

dokku_col_log_info1_quiet() {
  if [[ -z "$DOKKU_QUIET_OUTPUT" ]];then
    printf "%-25s %-25s %-25s %-25s\n" "-----> $@"
  else
    return 0
  fi
}

dokku_col_log_info2() {
  printf "%-25s %-25s %-25s %-25s\n" "=====> $@"
}

dokku_col_log_info2_quiet() {
  if [[ -z "$DOKKU_QUIET_OUTPUT" ]];then
    printf "%-25s %-25s %-25s %-25s\n" "=====> $@"
  else
    return 0
  fi
}

dokku_col_log_msg() {
  printf "%-25s %-25s %-25s %-25s\n" "$@"
}

dokku_col_log_msg_quiet() {
  if [[ -z "$DOKKU_QUIET_OUTPUT" ]];then
    printf "%-25s %-25s %-25s %-25s\n" "$@"
  else
    return 0
  fi
}

dokku_log_verbose_quiet() {
  if [[ -z "$DOKKU_QUIET_OUTPUT" ]];then
    echo "       $@"
  else
    return 0
  fi
}

dokku_log_verbose() {
  echo "       $@"
}

dokku_log_warn() {
  echo " !    $@"
}

dokku_log_fail() {
  echo "$@" 1>&2
  exit 1
}

dokku_container_log_verbose_quiet() {
  CID=$1;
  shift

  OIFS=$IFS
  IFS=$'\n'
  for line in $(docker logs $CID 2>&1); do
    dokku_log_verbose_quiet "$line"
  done
  IFS=$OIFS
}

verify_app_name() {
  local APP="$1"
  [[ ! -n "$APP" ]] && dokku_log_fail "(verify_app_name) APP must not be null"
  [[ ! -d "$DOKKU_ROOT/$APP" ]] && dokku_log_fail "App $APP does not exist"
  IMAGE="dokku/$APP"
  return 0
}

verify_image() {
  local IMAGE="$1"
  DOKKU_APP_IMAGES=$(docker images -q $IMAGE)
  if [[ -n "$DOKKU_APP_IMAGES" ]]; then
    return 0
  else
    return 1
  fi
}

is_image_buildstep_based() {
  # circleci can't support --rm as they run lxc in lxc
  [[ ! -f "/home/ubuntu/.circlerc" ]] && local DOCKER_ARGS="--rm"
  docker run --entrypoint="/bin/bash" $DOCKER_ARGS "$@" -c "[[ -f /exec ]]"
}

is_number() {
  local NUMBER=$1; local NUM_RE='^[0-9]+$'
  if [[ $NUMBER =~ $NUM_RE ]];then
    return 0
  else
    return 1
  fi
}

parse_args() {
  for arg in "$@"; do
    case "$arg" in
      --quiet)
        export DOKKU_QUIET_OUTPUT=1
        ;;
      --trace)
        export DOKKU_TRACE=1
        ;;
      --rm-container|--rm)
        export DOKKU_RM_CONTAINER=1
        ;;
      --force)
        export DOKKU_APPS_FORCE_DELETE=1
        ;;
    esac
  done
  return 0
}

copy_from_image() {
  local IMAGE="$1"; local SRC_FILE="$2"; local DST_DIR="$3"; verify_app_name $APP

  if verify_image "$IMAGE"; then
    CID=$(docker run -d $IMAGE bash)
    docker cp "$CID:$SRC_FILE" "$DST_DIR"
    docker rm -f "$CID" &> /dev/null
  else
    return 1
  fi
}

is_deployed() {
  APP="$1"
  if [[ -f "$DOKKU_ROOT/$APP/CONTAINER" ]] || [[ $(ls $DOKKU_ROOT/$APP/CONTAINER.* &> /dev/null; echo $?) -eq 0 ]];then
    return 0
  else
    return 1
  fi
}

get_container_ids() {
  APP="$1"
  verify_app_name $APP
  [[ -f $DOKKU_ROOT/$APP/CONTAINER ]] && DOKKU_CIDS+=$(< $DOKKU_ROOT/$APP/CONTAINER)

  shopt -s nullglob
  for DOKKU_CID_FILE in $DOKKU_ROOT/$APP/CONTAINER.*; do
    DOKKU_CIDS+=" "
    DOKKU_CIDS+=$(< $DOKKU_CID_FILE)
    DOKKU_CIDS+=" "
  done
  shopt -u nullglob
  echo $DOKKU_CIDS
}
