#!/usr/bin/env bash

# bash completion for Node Version Manager (NVM)

if ! command -v nvm &> /dev/null; then
  return
fi

__nvm_generate_completion() {
  declare current_word
  current_word="${COMP_WORDS[COMP_CWORD]}"
  # shellcheck disable=SC2207
  COMPREPLY=($(compgen -W "$1" -- "${current_word}"))
  return 0
}

__nvm_commands() {
  declare current_word
  declare command

  current_word="${COMP_WORDS[COMP_CWORD]}"

  COMMANDS='
    help install uninstall use run exec
    alias unalias reinstall-packages
    current list ls list-remote ls-remote
    install-latest-npm
    cache deactivate unload
    version version-remote which'

  if [ ${#COMP_WORDS[@]} == 4 ]; then

    command="${COMP_WORDS[COMP_CWORD - 2]}"
    case "${command}" in
      alias) __nvm_installed_nodes ;;
    esac

  else

    case "${current_word}" in
      -*) __nvm_options ;;
      *) __nvm_generate_completion "${COMMANDS}" ;;
    esac

  fi
}

__nvm_options() {
  OPTIONS=''
  __nvm_generate_completion "${OPTIONS}"
}

__nvm_installed_nodes() {
  __nvm_generate_completion "$(nvm_ls) $(__nvm_aliases)"
}

__nvm_aliases() {
  declare aliases
  aliases=""
  if [ -d "${NVM_DIR}/alias" ]; then
    aliases="$(cd "${NVM_DIR}/alias" && command find "${PWD}" -type f | command sed "s:${PWD}/::")"
  fi
  echo "${aliases} node stable unstable iojs"
}

__nvm_alias() {
  __nvm_generate_completion "$(__nvm_aliases)"
}

__nvm() {
  declare previous_word
  previous_word="${COMP_WORDS[COMP_CWORD - 1]}"

  case "${previous_word}" in
    use | run | exec | ls | list | uninstall) __nvm_installed_nodes ;;
    alias | unalias) __nvm_alias ;;
    *) __nvm_commands ;;
  esac

  return 0
}

# complete is a bash builtin, but recent versions of ZSH come with a function
# called bashcompinit that will create a complete in ZSH. If the user is in
# ZSH, load and run bashcompinit before calling the complete function.
if [[ -n ${ZSH_VERSION-} ]]; then
  # First calling compinit (only if not called yet!)
  # and then bashcompinit as mentioned by zsh man page.
  if ! command -v compinit > /dev/null; then
    autoload -U +X compinit && if [[ ${ZSH_DISABLE_COMPFIX-} = true ]]; then
      compinit -u
    else
      compinit
    fi
  fi
  autoload -U +X bashcompinit && bashcompinit
fi

complete -o default -F __nvm nvm
