#!/bin/bash
set -e
if [ $# -eq 0 ]; then
  install=false
else
  if [ "$1" = "install" ]; then
      install=true
  else
      echo "Invalid command, supported commands are: 'install'"
      exit 1
  fi
fi

if [[ "$PYTHON" =~ "python2" ]]; then
    echo "python2 is not supported." >&2
    exit 1
fi

# Use the newest version we find
if [ -z "$PYTHON" ]; then
  for i in 12 11 10; do
    command -v "python3.$i" && PYTHON="python3.$i" &>/dev/null && break
  done
fi
if [ -z "$PYTHON" ]; then
  # This would be bizarre, but I suppose possible
  PYTHON=${PYTHON:-"python3"}
fi
echo "Using python: $PYTHON"

case "$(uname -s)" in
Linux)
    if command -v lsb_release; then
        OS=$(lsb_release --id --short)
    else
        . /etc/os-release
        OS=$(echo $NAME | tr -d ' ')
    fi
    # rpm/dnf is the default, to reduce repetition in the case statement
    has_pkg="rpm -q --whatprovides"
    install_pkg="sudo dnf install -y"
    case "$OS" in
    Ubuntu|Debian|LinuxMint)
        deps=(qemu-utils python3-dev libssl-dev python3-pip python3-wheel python3-venv libev-dev libvirt-dev libffi-dev libyaml-dev build-essential jq curl)
        has_pkg="dpkg -s"
        install_pkg="sudo apt install -y"
        ;;
    RedHatEnterpriseWorkstation|RedHatEnterpriseServer|RedHatEnterprise|CentOS)
        deps=(python39-pip python39-devel mariadb-devel libev-devel libvirt-devel libffi-devel)
        ;;
    CentOSStream)
        PYTHON=python3.12
        deps=($PYTHON-pip $PYTHON-devel)
        ;;
    AlmaLinux|RockyLinux)
        PYTHON=python3.12
        deps=($PYTHON-pip $PYTHON-devel libev-devel libvirt-devel libffi-devel)
        ;;
    Fedora|FedoraLinux)
        deps=($PYTHON-pip $PYTHON-devel libev-devel libvirt-devel libffi-devel)
        ;;
    "openSUSE project"|"SUSE LINUX"|"openSUSE"|"openSUSELeap"|"openSUSETumbleweed")
        PYTHON=python3.12
        deps=(python312-pip python312-devel python312 libev-devel libvirt-devel libffi-devel)
        install_pkg="sudo zypper install"
        ;;
    esac
    ;;

Darwin)
    deps="python libvirt libev libffi"
    has_pkg="brew list"
    install_pkg="brew install"
    ;;
esac
for package in ${deps[@]}; do
    if ! $has_pkg $package &>/dev/null; then
        # add a space after old values
        missing="${missing:+$missing }$package"
        echo missing=${missing}
    fi
done
if [ -n "$missing" ]; then
    echo "$0: missing required packages:" 1>&2
    echo "$missing"
    if [ "$install" = true ]; then
        echo "Installing missing packages..."
        $install_pkg $missing
    else
        echo "Please install missing packages or run './bootstrap install'"
        echo "$install_pkg $missing"
        exit 1
    fi
    fi

PYTHON_BIN=$(command -v $PYTHON)
if [ -z $PYTHON_BIN -o ! -e $PYTHON_BIN -o ! -x $PYTHON_BIN ]; then
  echo "Cannot find $PYTHON!"
  exit 1
fi
PYTHON_VER_OUT=$($PYTHON_BIN --version)

VENV=${VENV:-"./virtualenv"}
# If the venv was set to use system site-packages, fix that
if [ -f "$VENV/pyvenv.cfg" ]; then
    sed -i'' -e 's/\(include-system-site-packages\s*=\s*\)true/\1false/g' $VENV/pyvenv.cfg
fi

# Attempt to force a UTF-8 locale without being specific to English
export LANG=${LANG:-C.UTF-8}
(echo $LANG | grep -qi utf-8) || export LC_ALL=$LANG.UTF-8

if [ -z "$NO_CLOBBER" ] && \
  [ ! -e "$VENV/bin/pip" -o ! -e "$VENV/bin/$PYTHON" ] || \
  [ "${PYTHON_VER_OUT}" != "$($VENV/bin/$PYTHON --version)" ] \
  ; then
   echo "Deleting existing virtual environment"
    rm -rf virtualenv
fi

if [ -z "$NO_CLOBBER" ] || [ ! -e $VENV ]; then
    echo "Creating new venv at $VENV"
    $PYTHON_BIN -m venv $VENV
fi

PY_MAJOR=$($VENV/bin/python -c "import sys; print(sys.version_info[0])")
PY_MINOR=$($VENV/bin/python -c "import sys; print(sys.version_info[1])")

# Python version check
if [[ "$PY_MAJOR" -ne 3 || "$PY_MINOR" -lt 10 ]]; then
    echo "Python version should be 3.10 or higher, found $PY_MAJOR.$PY_MINOR"
    exit 1
fi

$VENV/bin/pip install packaging

if [ -f "$VENV/bin/ansible" ]; then
    uninstall_ansible=$($VENV/bin/python3 -c "import ansible; from packaging.version import parse; print(parse(ansible.__version__) < parse('2.10.0'))")
    if [ "$uninstall_ansible" = "True" ]; then
        $VENV/bin/pip uninstall -y ansible
    fi
fi

# First, upgrade pip
$VENV/bin/pip install --upgrade pip

# See https://github.com/pypa/pip/issues/8559
$VENV/bin/pip install -r requirements.txt --use-pep517

# By default, install teuthology in editable mode
$VENV/bin/pip install ${PIP_INSTALL_FLAGS:---editable '.[test]'}

# Check to make sure requirements are met
$VENV/bin/pip check

# Install ansible collections
$VENV/bin/ansible-galaxy install -r requirements.yml

echo "Bootstrap completed successfully!!!"
