#!/usr/bin/env bash
#
# Summary: Display real_prefix for a Python virtualenv version
# Usage: pyenv virtualenv-prefix [<virtualenv>]
#

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

if [ -z "$PYENV_ROOT" ]; then
  PYENV_ROOT="${HOME}/.pyenv"
fi

if [ -n "$1" ]; then
  versions=($@)
  IFS=: PYENV_VERSION="${versions[*]}"
  export PYENV_VERSION
else
  IFS=: versions=($(pyenv-version-name))
fi

real_prefix() { # virtualenv
  local version="$1"
  PYENV_VERSION="${version}" pyenv-exec python -c 'import sys;print(sys.real_prefix)' 2>/dev/null
}

base_prefix() { # pyvenv
  # FIXME: non-pyvenv versions also have sys.base_prefix
  local version="$1"
  PYENV_VERSION="${version}" pyenv-exec python -c 'import sys;print(sys.base_prefix)' 2>/dev/null
}

VIRTUALENV_PREFIX_PATHS=()
for version_string in "${versions[@]}"; do
  version="${version_string%%/*}"
  if [ "$version" = "system" ]; then
    echo "pyenv-virtualenv: version \`${version}' is not a virtualenv" 1>&2
    exit 1
  fi
  PREFIX="$(pyenv-prefix "${version}")"
  if [ -f "${PREFIX}/bin/activate" ]; then
    # Anaconda has `activate` script nevertheless it is not a virtual environment (#65)
    if [ -f "${PREFIX}/bin/conda" ]; then
      if [[ "${version_string}" != "${version_string%/envs/*}" ]]; then
        conda_env="${version_string##*/envs/}"
        if [ -f "${PREFIX}/envs/${conda_env}/bin/conda" ]; then
          VIRTUALENV_PREFIX_PATHS=("${VIRTUALENV_PREFIX_PATHS[@]}" "${PREFIX}")
        else
          echo "pyenv-virtualenv: version \`${version_string}' is not an environment of anaconda/miniconda" 1>&2
          exit 1
        fi
      else
        VIRTUALENV_PREFIX_PATHS=("${VIRTUALENV_PREFIX_PATHS[@]}" "${PREFIX}")
      fi
    else
      VIRTUALENV_PREFIX_PATH="$(real_prefix "${version}" || base_prefix "${version}" || true)"
      VIRTUALENV_PREFIX_PATHS=("${VIRTUALENV_PREFIX_PATHS[@]}" "$VIRTUALENV_PREFIX_PATH")
    fi
  else
    echo "pyenv-virtualenv: version \`${version}' is not a virtualenv" 1>&2
    exit 1
  fi
done

IFS=: echo "${VIRTUALENV_PREFIX_PATHS[*]}"
