#!/usr/bin/env bash

set +e
runtime-fixer runtime.txt
PYTHON_VERSION=$(cat runtime.txt)

# The location of the pre-compiled python binary.
VENDORED_PYTHON="${VENDOR_URL}/runtimes/$PYTHON_VERSION.tar.gz"

SECURITY_UPDATE="Python has released a security update! Please consider upgrading to"

ONLY_SUPPORTED_2_VERSION="Only the latest version of Python 2 is supported on the platform. Please consider upgrading to"

PYTHON_2_EOL_UPDATE="Python 2 has reached it's community EOL. Upgrade your Python runtime to maintain a secure application as soon as possible."

# check if runtime exists
if curl --output /dev/null --silent --head --fail "$VENDORED_PYTHON"; then
  if [[ "$PYTHON_VERSION" == $PY38* ]]; then
    # do things to alert the user of security release available
    if [ "$PYTHON_VERSION" != "$LATEST_38" ]; then
      puts-warn "$SECURITY_UPDATE" "$LATEST_38"
      echo "       Learn More: https://devcenter.heroku.com/articles/python-runtimes"
    fi
  fi
  if [[ "$PYTHON_VERSION" == $PY37* ]]; then
    # do things to alert the user of security release available
    if [ "$PYTHON_VERSION" != "$LATEST_37" ]; then
      puts-warn "$SECURITY_UPDATE" "$LATEST_37"
      echo "       Learn More: https://devcenter.heroku.com/articles/python-runtimes"
    fi
  fi
  if [[ "$PYTHON_VERSION" == $PY36* ]]; then
    # security update note
    if [ "$PYTHON_VERSION" != "$LATEST_36" ]; then
      puts-warn "$SECURITY_UPDATE" "$LATEST_36"
      echo "       Learn More: https://devcenter.heroku.com/articles/python-runtimes"
    fi
  fi
  if [[ "$PYTHON_VERSION" == $PY35* ]]; then
    # security update note
    if [ "$PYTHON_VERSION" != "$LATEST_35" ]; then
      puts-warn "$SECURITY_UPDATE" "$LATEST_35"
      echo "       Learn More: https://devcenter.heroku.com/articles/python-runtimes"
    fi
  fi
  if [[ "$PYTHON_VERSION" == $PY34* ]]; then
    # security update note
    if [ "$PYTHON_VERSION" != "$LATEST_34" ]; then
      puts-warn "$SECURITY_UPDATE" "$LATEST_34"
      echo "       Learn More: https://devcenter.heroku.com/articles/python-runtimes"
    fi
  fi
  if [[ "$PYTHON_VERSION" == $PY27* ]]; then
    # security update note
    if [[ "$(date "+%Y")" -gt "2019" ]]; then
      puts-warn "$PYTHON_2_EOL_UPDATE"
      echo "       Learn More: https://devcenter.heroku.com/articles/python-2-7-eol-faq"
    fi
    if [ "$PYTHON_VERSION" != "$LATEST_27" ]; then
      puts-warn "$ONLY_SUPPORTED_2_VERSION" "$LATEST_27"
      echo "       Learn More: https://devcenter.heroku.com/articles/python-runtimes"
    fi
  fi
  if [[ "$PYTHON_VERSION" == $PYPY27* ]]; then
    # security update note
    if [ "$PYTHON_VERSION" != "$PYPY_27" ]; then
      puts-warn "Could not find that Pypy version. Did you mean" "${PYPY_27}?"
      echo "       Learn More: https://devcenter.heroku.com/articles/python-runtimes"
    fi
  fi
  if [[ "$PYTHON_VERSION" == $PYPY36* ]]; then
    # security update note
    if [ "$PYTHON_VERSION" != "$PYPY_36" ]; then
      puts-warn "Could not find that Pypy version. Did you mean" "${PYPY_36}?"
      echo "       Learn More: https://devcenter.heroku.com/articles/python-runtimes"
    fi
  fi
else
  puts-warn "Requested runtime ($PYTHON_VERSION) is not available for this stack ($STACK)."
  puts-warn "Aborting.  More info: https://devcenter.heroku.com/articles/python-support"
  exit 1
fi

if [[ "$STACK" != "$CACHED_PYTHON_STACK" ]]; then
    puts-step "Stack has changed from $CACHED_PYTHON_STACK to $STACK, clearing cache"
    rm -fr .heroku/python-stack .heroku/python-version .heroku/python .heroku/vendor .heroku/python .heroku/python-sqlite3-version
fi

if [ -f .heroku/python-version ]; then
  if [ ! "$(cat .heroku/python-version)" = "$PYTHON_VERSION" ]; then
      puts-step "Found $(cat .heroku/python-version), removing"
      rm -fr .heroku/python
  else
    SKIP_INSTALL=1
  fi
fi

# Check if we should reinstall python dependencies
if [[ ! -f "$CACHE_DIR/.heroku/requirements.txt" ]]; then
  # IF there's no cached dependencies, update cached version of requirements.txt
  # This should only run for new apps and first deploys after this update
  cp -R "$BUILD_DIR/requirements.txt" "$CACHE_DIR/.heroku/requirements.txt"
else
  # IF there IS a cached directory, check for differences with the new one
  if ! diff "$BUILD_DIR/requirements.txt" "$CACHE_DIR/.heroku/requirements.txt" &> /dev/null; then
    puts-step "Requirements file has been changed, clearing cached dependencies"
    # if there are any differences, clear the Python cache
    # Installing Python over again does not take noticably more time
    cp -R "$BUILD_DIR/requirements.txt" "$CACHE_DIR/.heroku/requirements.txt"
    rm -rf .heroku/python
    unset SKIP_INSTALL
  else
    puts-step "No change in requirements detected, installing from cache"
  fi
fi

if [ ! "$SKIP_INSTALL" ]; then
    puts-step "Installing $PYTHON_VERSION"

    # Prepare destination directory.
    mkdir -p .heroku/python

    mcount "version.python.$PYTHON_VERSION"

    if ! curl "${VENDORED_PYTHON}" -s | tar zxv -C .heroku/python &> /dev/null; then
      puts-warn "Requested runtime ($PYTHON_VERSION) is not available for this stack ($STACK)."
      puts-warn "Aborting.  More info: https://devcenter.heroku.com/articles/python-support"
      exit 1
    fi

  # Record for future reference.
  echo "$PYTHON_VERSION" > .heroku/python-version
  echo "$STACK" > .heroku/python-stack
  FRESH_PYTHON=true

  hash -r
fi

# Heroku uses the get-pip utility maintained by the Python community to vendor Pip.
# https://github.com/pypa/get-pip
GETPIP_URL="https://lang-python.s3.amazonaws.com/etc/get-pip.py"
GETPIP_PY="${TMPDIR:-/tmp}/get-pip.py"

if ! curl -s "${GETPIP_URL}" -o "$GETPIP_PY" &> /dev/null; then
    mcount "failure.python.get-pip"
    echo "Failed to pull down get-pip"
    exit 1
fi

# If a new Python has been installed or Pip isn't up to date:
if [ "$FRESH_PYTHON" ] || [[ ! $(pip --version) == *$PIP_UPDATE* ]]; then

  puts-step "Installing pip"

  # Remove old installations.
  rm -fr /app/.heroku/python/lib/python*/site-packages/pip-*
  rm -fr /app/.heroku/python/lib/python*/site-packages/setuptools-*

  /app/.heroku/python/bin/python "$GETPIP_PY" pip=="$PIP_UPDATE" &> /dev/null
  /app/.heroku/python/bin/pip install "$ROOT_DIR/vendor/setuptools-39.0.1-py2.py3-none-any.whl" &> /dev/null
fi

set -e
hash -r
