#!/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" && break
  done
fi
if [ -z "$PYTHON" ]; then
  # This would be bizarre, but I suppose possible
  PYTHON=${PYTHON:-"python3"}
fi

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
    case "$OS" in
    Ubuntu|Debian|LinuxMint)
        deps=(qemu-utils python3-dev libssl-dev python3-pip python3-wheel $PYTHON-venv libev-dev libvirt-dev libffi-dev libyaml-dev)
        for package in ${deps[@]}; do
            if [ "$(dpkg --status -- $package|sed -n 's/^Status: //p')" != "install ok installed" ]; then
                # add a space after old values
                missing="${missing:+$missing }$package"
            fi
        done
        if [ -n "$missing" ]; then
            echo "$0: missing required packages:" 1>&2
            echo "$missing"
            if [ "$install" = true ]; then
                echo "Updating metadata..."
                sudo apt-get update
                echo "Installing missing packages..."
                sudo apt-get -y install $missing
            else
                echo "Please install missing packages or run './bootstrap install' if you have sudo"
                echo "sudo apt-get -y install $missing"
                exit 1
            fi
        fi
        ;;
    RedHatEnterpriseWorkstation|RedHatEnterpriseServer|RedHatEnterprise|CentOS)
        deps=(python39-pip python39-devel mariadb-devel libev-devel libvirt-devel libffi-devel)
        for package in ${deps[@]}; do
          if ! rpm -q --whatprovides $package ; then
              missing="${missing:+$missing }$package"
          fi
        done
        if [ -n "$missing" ]; then
            echo "$0: missing required packages:" 1>&2
            echo "$missing"
            if [ "$install" = true ]; then
                echo "Installing missing packages..."
                sudo yum -y install $missing
            else
                echo "Please install missing packages or run './bootstrap install' if you have sudo"
                echo "sudo yum -y install $missing"
                exit 1
            fi
        fi
        ;;
    CentOSStream)
       PYTHON=python3.12
        deps=($PYTHON-pip $PYTHON-devel)
        for package in ${deps[@]}; do
          if ! rpm -q --whatprovides $package ; then
              missing="${missing:+$missing }$package"
          fi
        done
        if [ -n "$missing" ]; then
            echo "$0: missing required packages:" 1>&2
            echo "$missing"
            if [ "$install" = true ]; then
                echo "Installing missing packages..."
                sudo yum -y install $missing
            else
                echo "Please install missing packages or run './bootstrap install' if you have sudo"
                echo "sudo yum -y install $missing"
                exit 1
            fi
        fi
        ;;
    AlmaLinux|RockyLinux)
       PYTHON=python3.12
        deps=($PYTHON-pip $PYTHON-devel libev-devel libvirt-devel libffi-devel)
        for package in ${deps[@]}; do
          if ! rpm -q --whatprovides $package; then
              missing="${missing:+$missing }$package"
          fi
        done
        if [ -n "$missing" ]; then
            echo "$0: missing required packages:" 1>&2
            echo "$missing"
            if [ "$install" = true ]; then
                echo "Installing missing packages..."
                sudo yum -y install $missing
            else
                echo "Please install missing packages or run './bootstrap install' if you have sudo"
                echo "sudo yum -y install $missing"
                exit 1
            fi
        fi
        ;;
    Fedora|FedoraLinux)
       PYTHON=python3.12
        deps=($PYTHON-pip $PYTHON-devel)
        deps=($PYTHON-pip $PYTHON-devel libev-devel libvirt-devel libffi-devel)
        for package in ${deps[@]}; do
          if ! rpm -q --whatprovides $package; then
              missing="${missing:+$missing }$package"
          fi
        done
        fedora_release=$(lsb_release -rs)
        package_manager=dnf
        if [ $fedora_release -lt 23 ]; then
            package_manager=yum
        fi
        if [ -n "$missing" ]; then
            echo "$0: missing required packages:" 1>&2
            echo "$missing"
            if [ "$install" = true ]; then
                echo "Installing missing packages..."
                sudo $package_manager -y install $missing
            else
                echo "Please install missing packages or run './bootstrap install' if you have sudo"
                echo "sudo $package_manager -y install $missing"
                exit 1
            fi
        fi
        ;;
    "openSUSE project"|"SUSE LINUX"|"openSUSE"|"openSUSELeap"|"openSUSETumbleweed")
	PYTHON=python3.12
	deps=(python312-pip python312-devel python312 libev-devel libvirt-devel libffi-devel)
	for package in ${deps[@]}; do
            if ! rpm -q --whatprovides $package; then
                if [ "$(rpm -q --whatprovides $package)" == "no package provides $package" ]; then
                    missing="${missing:+$missing }$package"
                fi
            fi
        done
        if [ -n "$missing" ]; then
            echo "$0: missing required packages, please install them:" 1>&2
            echo "sudo zypper install $missing"
            exit 1
        fi
        ;;
    *)
        echo "This script does not support your Linux distribution yet. Patches encouraged!"
        exit 1
        ;;
    esac
    ;;
Darwin)
    if ! brew --version &>/dev/null; then
        echo "You need Homebrew: http://brew.sh/"
        exit 1
    fi
    for keg in python libvirt libev libffi; do
        if brew list $keg >/dev/null 2>&1; then
            echo "Found $keg"
        else
            if [ "$install" = true ]; then
                brew install $keg
            else
                missing="${missing:+$missing }$keg"
                echo "Please install missing packages or run './bootstrap install':"
                echo "brew install $missing"
                exit 1
            fi
        fi
    done
    ;;
*)
    echo "This script does not support your OS yet. Patches encouraged!"
    exit 1
    ;;
esac

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
    rm -rf virtualenv
fi

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

$VENV/bin/pip install packaging

# It is impossible to upgrade ansible from 2.9 to 2.10 via pip.
# See https://docs.ansible.com/ansible/devel/porting_guides/porting_guide_2.10.html#known-issues
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
