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

function doSetup() {
  if [ -n "${1}" ] || [ ! -d "${VSCODE_HOME}" ]
  then
    local software_version="${VSCODE_VERSION:-1.36.1}"
    local download_url="https://update.code.visualstudio.com/${software_version}"
    local software_extension=".zip"
    if doIsMacOs
    then
      download_url="${download_url}/darwin/stable"
    elif doIsWindows
    then
      download_url="${download_url}/win32-x64-archive/stable"
    else
      download_url="${download_url}/linux-x64/stable"
      software_extension=".tgz"
    fi
    doInstall "${VSCODE_HOME}" "${download_url}" "vscode" "${software_version}" "${software_extension}"
    if [ "${?}" = 0 ]
    then
      if doIsMacOs
      then
        mkdir "${VSCODE_HOME}/bin"
        echo -e "#!/usr/bin/env bash\n\"${VSCODE_HOME}/Visual Studio Code.app/Contents/MacOS/Electron\" \$@" > "${VSCODE_HOME}/bin/code"
        chmod a+x "${VSCODE_HOME}/bin/code"
      fi
      echo "******* Notice *******"
      echo "Installing plugins (extension-pack) into VS code..."
      echo "Please wait until VSCode has successfully installed all plugins."
      echo "You may then use or close VSCode as you like."
      doRunCommand "'${VSCODE_HOME}/bin/code' --install-extension devonfw.devonfw-extension-pack &"
    fi
  fi
}

function doConfigureVsCode() {
  local mode="${1}"
  if [ ! -d "${WORKSPACE_PATH}/.vscode" ]
  then
    if [ "${mode}" = "-i" ] || [ "${mode}" = "-x" ]
    then
      doFail "Workspace ${WORKSPACE} is not initialized.\nReverse merge is not possible."
    fi
    mode="-u"
  fi
  if [ -n "${mode}" ]
  then
    doConfigureWorkspace "${SETTINGS_PATH}/vscode/workspace" "${WORKSPACE_PATH}" "${mode}"
  fi
}

function doStartVsCode() {
  doConfigureVsCode
  echo "launching VSCode..."
  "${VSCODE_HOME}/bin/code" "${WORKSPACE_PATH}"
}

# CLI
if [ "${1}" = "-h" ] || [ "${1}" = "help" ]
then
  echo "Launch Visual Studio Code and/or manage VSCode workspace."
  echo
  echo "Arguments:"
  echo " --all                if provided as first arg then to command will be invoked for each workspace"
  echo " setup                setup VSCode (install or update)"
  echo " run | start          launch VSCode IDE (default if no argument is given)"
  echo " ws-up[date]          update VSCode workspace"
  echo " ws-re[verse]         reverse merge changes from workspace into settings"
  echo " ws-reverse-add       reverse merge adding new properties"
  echo " create-script        create vscode-${WORKSPACE} script if not already exists"
  echo
  echo "Options:"
  exit
fi
VSCODE_HOME="${DEVON_IDE_HOME}/software/vscode"
if [ -z "${1}" ]
then
  doSetup
  doStartVsCode
fi
if [ "${1}" = "--all" ]
then
  shift
  doDevonCommandAllWorkspaces vscode "${@}"
fi
while [ -n "${1}" ]
do
  if [ "${1}" = "run" ] || [ "${1}" = "start" ]
  then
    doSetup
    doStartVsCode
  elif [ "${1}" = "ws-up" ] || [ "${1}" = "ws-update" ]
  then
    doConfigureVsCode -u
  elif [ "${1}" = "ws-re" ] || [ "${1}" = "ws-reverse" ]
  then
    doConfigureVsCode -i
  elif [ "${1}" = "ws-reverse-add" ]
  then
    doConfigureVsCode -x
  elif [ "${1}" = "setup" ]
  then
    doSetup setup
    doCreateIdeScript vscode
  elif [ "${1}" = "create-script" ]
  then
    doCreateIdeScript vscode
  else
    doFail "Undefined argument: ${1}"
  fi
  shift
done
