#!/usr/bin/env bash
set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$PLUGIN_AVAILABLE_PATH/config/functions"
source "$PLUGIN_AVAILABLE_PATH/ps/functions"

ps_restore_cmd() {
  declare desc="starts all apps with DOKKU_APP_RESTORE not set to 0 via command line"
  local cmd="ps:restore"
  local APP="$1"

  if [[ -n "$APP" ]]; then
    DOKKU_APP_RESTORE="$(config_get "$APP" DOKKU_APP_RESTORE || true)"
    if [[ $DOKKU_APP_RESTORE != 0 ]]; then
      ps_start "$APP" || dokku_log_warn "dokku ps:restore ${APP} failed"
    fi
  else
    ps_restore_all
  fi
}
  
ps_restore_all() {
  local GNU_PARALLEL

  if which parallel > /dev/null 2>&1; then
    dokku_log_info1 "Restarting in parallel"
    GNU_PARALLEL=$(parallel -V 2>&1 | grep GNU || true)
    if [[ -z "$GNU_PARALLEL" ]]; then
      parallel -i bash -c "dokku ps:restore {}" -- $(dokku_apps)
    else
      dokku_apps | parallel --will-cite 'dokku ps:restore {}'
    fi
    return
  fi

  for app in $(dokku_apps); do
    local DOKKU_APP_RESTORE=$(config_get "$app" DOKKU_APP_RESTORE || true)
    if [[ $DOKKU_APP_RESTORE != 0 ]]; then
      echo "Restoring app $app ..."
      if ps_start "$app"; then
        continue
      fi
      dokku_log_warn "dokku ps:restore ${app} failed"
    fi
  done
}

ps_restore_cmd "$@"
