_exercism () {
  local cur prev

  COMPREPLY=()   # Array variable storing the possible completions.
  cur=${COMP_WORDS[COMP_CWORD]}
  prev=${COMP_WORDS[COMP_CWORD-1]}
  opts="--verbose --timeout"

  commands="configure download open
  submit troubleshoot upgrade version workspace help"
  config_opts="--show"
  version_opts="--latest"

  if [ "${#COMP_WORDS[@]}" -eq 2 ]; then
    case "${cur}" in
      -*)
        COMPREPLY=( $( compgen -W  "${opts}" -- "${cur}" ) )
        return 0
        ;;
      *)
        COMPREPLY=( $( compgen -W  "${commands}" "${cur}" ) )
        return 0
        ;;
    esac
  fi

  if [ "${#COMP_WORDS[@]}" -eq 3 ]; then
    case "${prev}" in
      configure)
        COMPREPLY=( $( compgen -W "${config_opts}" -- "${cur}" ) )
        return 0
        ;;
      version)
        COMPREPLY=( $( compgen -W "${version_opts}" -- "${cur}" ) )
        return 0
        ;;
      help)
        COMPREPLY=( $( compgen -W "${commands}" "${cur}" ) )
        return 0
        ;;
      *)
        return 0
        ;;
    esac
  fi

  return 0
}

complete -o bashdefault -o default -o nospace -F _exercism exercism 2>/dev/null \
	|| complete -o default -o nospace -F _exercism exercism
