#!/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
  autoload -U +X bashcompinit && bashcompinit
  autoload -U +X compinit && compinit
fi

complete -o default -F __nvm nvm
