#!/usr/bin/env bash
# Summary: Configure the shell environment for pyenv-virtualenv
# Usage: eval "$(pyenv virtualenv-init - [<shell>])"
#
# Automatically activates a Python virtualenv environment based on current
# pyenv version.
#

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

resolve_link() {
  $(type -p greadlink readlink | head -1) "$1"
}

abs_dirname() {
  local cwd="$(pwd)"
  local path="$1"

  while [ -n "$path" ]; do
    cd "${path%/*}"
    local name="${path##*/}"
    path="$(resolve_link "$name" || true)"
  done

  pwd
  cd "$cwd"
}

PYENV_VIRTUALENV_INSTALL_PREFIX="$(dirname "$(abs_dirname "$0")")"

print=""
for args in "$@"
do
  if [ "$args" = "-" ]; then
    print=1
    shift
  fi
done

shell="${1:-$PYENV_SHELL}"
if [ -z "$shell" ]; then
  shell="$(ps -p "$PPID" -o 'args=' 2>/dev/null || true)"
  shell="${shell##-}"
  shell="${shell%% *}"
  shell="${shell:-$SHELL}"
  shell="${shell##*/}"
  shell="${shell%%-*}"
fi

if [ -z "$print" ]; then
  case "$shell" in
  bash )
    profile='~/.bashrc'
    ;;
  zsh )
    profile='~/.zshrc'
    ;;
  ksh )
    profile='~/.profile'
    ;;
  fish )
    profile='~/.config/fish/config.fish'
    ;;
  * )
    profile='your profile'
    ;;
  esac

  { echo "# Load pyenv-virtualenv automatically by adding"
    echo "# the following to ${profile}:"
    echo
    case "$shell" in
    fish )
      echo 'status --is-interactive; and source (pyenv virtualenv-init -|psub)'
      ;;
    * )
      echo 'eval "$(pyenv virtualenv-init -)"'
      ;;
    esac
    echo
  } >&2

  exit 1
fi

case "$shell" in
fish )
  cat <<EOS
while set index (contains -i -- "${PYENV_VIRTUALENV_ROOT:-${PYENV_VIRTUALENV_INSTALL_PREFIX}}/shims" \$PATH)
set -eg PATH[\$index]; end; set -e index
set -gx PATH '${PYENV_VIRTUALENV_ROOT:-${PYENV_VIRTUALENV_INSTALL_PREFIX}}/shims' \$PATH;
set -gx PYENV_VIRTUALENV_INIT 1;
EOS
  ;;
* )
  cat <<EOS
export PATH="${PYENV_VIRTUALENV_ROOT:-${PYENV_VIRTUALENV_INSTALL_PREFIX}}/shims:\${PATH}";
export PYENV_VIRTUALENV_INIT=1;
EOS
  ;;
esac

case "$shell" in
fish )
  cat <<EOS
function _pyenv_virtualenv_hook --on-event fish_prompt;
  set -l ret \$status
  if [ -n "\$VIRTUAL_ENV" ]
    pyenv activate --quiet; or pyenv deactivate --quiet; or true
  else
    pyenv activate --quiet; or true
  end
  return \$ret
end
EOS
 ;;
ksh )
  cat <<EOS
function _pyenv_virtualenv_hook() {
EOS
  ;;
* )
  cat <<EOS
_pyenv_virtualenv_hook() {
EOS
  ;;
esac

if [[ "$shell" != "fish" ]]; then
  cat <<EOS
  local ret=\$?
  if [ -n "\${VIRTUAL_ENV-}" ]; then
    eval "\$(pyenv sh-activate --quiet || pyenv sh-deactivate --quiet || true)" || true
  else
    eval "\$(pyenv sh-activate --quiet || true)" || true
  fi
  return \$ret
};
EOS

  case "$shell" in
  bash )
    cat <<EOS
if ! [[ "\${PROMPT_COMMAND-}" =~ _pyenv_virtualenv_hook ]]; then
  PROMPT_COMMAND="_pyenv_virtualenv_hook;\${PROMPT_COMMAND-}"
fi
EOS
    ;;
  zsh )
    cat <<EOS
typeset -g -a precmd_functions
if [[ -z \$precmd_functions[(r)_pyenv_virtualenv_hook] ]]; then
  precmd_functions=(_pyenv_virtualenv_hook \$precmd_functions);
fi
EOS
    ;;
  * )
    # FIXME: what should i do here??
    ;;
  esac
fi
