#!/usr/bin/env bash
#
# Summary: Activate virtual environment
#
# Usage: pyenv activate <virtualenv>
#        pyenv activate --unset
#
# Activate a Python virtualenv environment in current shell.
# This acts almost as same as `pyenv shell`, but this invokes the `activate`
# script in your shell.
#
# <virtualenv> should be a string matching a Python version known to pyenv.

set -e
[ -n "$PYENV_DEBUG" ] && set -x

unset NOERROR
unset VERBOSE

while [ $# -gt 0 ]; do
  case "$1" in
  "--complete" )
    # Provide pyenv completions
    echo --unset
    exec pyenv-virtualenvs --bare
    ;;
  "--no-error" )
    NOERROR=1
    ;;
  "--unset" )
    echo "pyenv deactivate"
    exit
    ;;
  "--verbose" )
    VERBOSE=1
    ;;
  * )
    break
    ;;
  esac
  shift 1
done

versions=("$@")
if [ -z "$versions" ]; then
  no_shell=1
  OLDIFS="$IFS"
  IFS=: versions=($(pyenv-version-name))
  IFS="$OLDIFS"
fi

if [ -z "${PYENV_VIRTUALENV_INIT}" ]; then
  # Backward compatibility issue
  # https://github.com/yyuu/pyenv-virtualenv/issues/26
  no_shell=
fi

if [ "${#versions[@]}" -gt 1 ]; then
  [ -n "$NOERROR" ] || echo "pyenv-virtualenv: cannot activate multiple versions at once: ${versions[@]}" 1>&2
  echo "false"
  exit 1
fi

if ! pyenv-virtualenv-prefix "${versions}" 1>/dev/null 2>&1; then
  [ -n "$NOERROR" ] || echo "pyenv-virtualenv: version \`${versions}' is not a virtualenv" 1>&2
  echo "false"
  exit 1
fi

shell="$(basename "${PYENV_SHELL:-$SHELL}")"
case "$shell" in
bash )
  profile="$HOME/.bash_profile"
  ;;
zsh )
  profile="$HOME/.zshrc"
  ;;
ksh )
  profile="$HOME/.profile"
  ;;
fish )
  profile="$HOME/.config/fish/config.fish"
  ;;
* )
  profile="$HOME/.profile"
  ;;
esac

# Display setup instruction if 'pyenv virtualenv-init -' is not found in "$profile"
if [ -f "$profile" ] && grep -q 'pyenv init -' "$profile" && ! grep -q 'pyenv virtualenv-init -' "$profile"; then
  pyenv-virtualenv-init >&2 || true
fi

if [ -n "$VERBOSE" ]; then
  echo "pyenv-virtualenv: activate ${versions}" 1>&2
fi

if [ -z "$no_shell" ]; then
  echo "pyenv shell \"${versions}\";"
fi

prefix="$(pyenv-prefix "${versions}")"
case "$shell" in
fish )
  cat <<EOS
set -e PYENV_DEACTIVATE;
setenv PYENV_ACTIVATE "${prefix}";
. "${prefix}/bin/activate.fish";
EOS
 ;;
*    )
  cat <<EOS
unset PYENV_DEACTIVATE;
export PYENV_ACTIVATE="${prefix}";
. "${prefix}/bin/activate";
EOS
  ;;
esac
