#!/usr/bin/env bash
# shellcheck source=scripts/functions
source "$(dirname "${0}")"/../functions

# $1: optional setup
function doSetup() {
  if [ -n "${1}" ] || [ ! -d "${NODE_HOME}" ]
  then
    local software_version="${NODE_VERSION:-v12.13.1}"
    local download_url="https://nodejs.org/dist/${software_version}/node-${software_version}"
    local software_dir="${NODE_HOME}"
    if doIsMacOs
    then
      download_url="${download_url}-darwin-x64.tar.gz"
    elif doIsWindows
    then
      download_url="${download_url}-win-x64.zip"
    else
      download_url="${download_url}-linux-x64.tar.xz"
    fi
    doInstall "${software_dir}" "${download_url}" "nodejs" "${software_version}"
  fi
  if [ -n "${1}" ] && ! doIsQuiet
  then
    local node_binary="${NODE_HOME}/node.exe"
    if [ ! -x "${node_binary}" ]
    then
      node_binary="${NODE_HOME}/bin/node"
    fi
    doRunCommand "'${node_binary}' -v" "verify installation of node.js"
  fi
}

function doSetupDevon4node() {
  if ! command -v devon4node &> /dev/null
  then
    doDevonCommand yarn -q setup
    doDevonCommand npm install -g @devon4node/cli@latest
  fi
}

function doRun() {
  doSetup
  doEcho "Running: node ${*}"
  if doIsQuiet
  then
    node "${*}" > /dev/null
  else
    node "${*}"
  fi
}

if [ -z "${NODE_HOME}" ]
then
  NODE_HOME="${DEVON_IDE_HOME}/software/node"
fi

#CLI
case ${1} in 
"help" | "-h")
  echo "Setup or run NodeJS."
  echo
  echo "Arguments:"
  echo " setup                    setup NodeJS (install and verify)"
  echo " create «name» [«args»]   create a new devon4node application (same as devon4node new)"
  echo " generate «s» [«args»]    generate devon4node components using the schematic «s» (same as devon4node generate)"
  echo " db «c» [«args»]          execute a TypeORM command «c» (same as devon4node db)"
  echo " cicd «args»              generate cicd files for the current devon4node project: $PWD"
  echo " «args»                   call NodeJS with the specified arguments"
  echo
  echo "Options:"
  exit
;;
"setup" | "s")
  doSetup setup
;;
"create" | "c")
  shift
  doSetupDevon4node
  devon4node new "${@}"
;;
"generate" | "g")
  doSetupDevon4node
  devon4node "${@}"
;;
"db")
  doSetupDevon4node
  devon4node "${@}"
;;
"cicd")
  shift
  doDevonCommand cicdgen node "${*}"
;;
*)
  doRun "${*}"
;;
esac
