#!/usr/bin/env bash

requirements_find_alt()
{
  if # find macports in PATH
    __rvm_which port >/dev/null 2>&1
  then
    return 0
  else # find apt-get in and out of PATH and link to rvm/bin
    \typeset __binary
    for __binary in /usr/bin/apt-get /usr/local/bin/apt-get
    do
      if
        [[ -f "${__binary}" && -s "${__binary}" && -x "${__binary}" ]]
      then
        PATH="$PATH:${__binary%/*}"
        return 0
      fi
    done
    return 1
  fi
}

__rvm_try_sudo()
{
  if
    [[ "$1" == "-p" ]]
  then
    rvm_printf_to_stderr "${2//%p/[root]/}"
    shift 2
  fi
  ssh root@localhost -o PasswordAuthentication=false -o "RemoteCommand=$*" 2>/dev/null || sudo -n "$*" 2>/dev/null || true
}

requirements_alt_lib_installed() {
  if
    [[ -z "$(apt-cache depends "$1" 2>/dev/null)" ]]
  then
    return 1
  else
    return 0
  fi
}

requirements_alt_lib_available()
{
  apt-cache search "^${1}$" >/dev/null 2>&1 || return $?
}

requirements_alt_libs_install()
{
  __rvm_try_sudo apt-get install -y "$@" || return $?
}

requirements_alt_libs_remove()
{
  __rvm_try_sudo apt-get remove -y "$@" || return $?
}

requirements_alt_update_system()
{
  # Has to be ran separately so new version can be used for installing missing libs
  requirements_alt_libs_install apt rpm &&
  case "$1" in
    (ruby*)
      requirements_alt_libs_install ruby
      ;;
  esac || return $?
}

requirements_alt_define_openssl()
{
  requirements_check openssl
}

requirements_alt_define()
{
  case "$1" in
    (rvm)
      requirements_check bash curl patch
      ;;
    (jruby*)
      requirements_check curl make

      if
        is_head_or_disable_binary "$1"
      then
        requirements_check_fallback java-11-openjdk
        requirements_check git
        case $( jruby_installation_method  "$1" ) in
          ant) __rvm_which ant >/dev/null || requirements_check apache-ant ;;
          mvn) __rvm_which mvn >/dev/null || requirements_check maven      ;;
        esac
      else
        requirements_check_fallback java-11-openjdk
      fi
      ;;
    (ir*)
      requirements_check mono-core
      ;;
    (opal)
      requirements_check node npm
      ;;
    (rbx*head|rubinius*head)
      undesired_check clang llvm llvm-common llvm-rocm
      requirements_check clang llvm llvm-common llvm-rocm patch curl zlib libreadline-devel autoconf automake diffutils make libtool bison git
      ;;
    (rbx-3*|rubinius-3*)
      undesired_check clang llvm llvm-common llvm-rocm
      requirements_check clang llvm llvm-common llvm-rocm patch curl zlib libreadline-devel autoconf automake diffutils make libtool bison
      ;;
    (rbx-2*|rubinius-2*)
      undesired_check clang llvm llvm-common llvm-rocm
      requirements_check clang llvm llvm-common llvm-rocm patch curl zlib libreadline-devel autoconf automake diffutils make libtool bison
      ;;
    (rbx-1*|rubinius-1*)
      undesired_check clang llvm llvm-common llvm-rocm
      requirements_check clang llvm llvm-common llvm-rocm patch curl zlib libreadline-devel autoconf automake diffutils make libtool bison
      ;;
    (truffleruby*)
      requirements_check zlib make gcc libxml2-devel
      requirements_alt_define_openssl "$1"
      ;;
    (ruby-2.3*|ruby-2.2*|ruby-2.1*|ruby-2.0*|ruby-1.9*)
      requirements_check gcc patch curl zlib libreadline-devel autoconf automake diffutils make libtool bison sqlite3 git
      requirements_alt_define_openssl "$1"
      ;;
    (*-head)
      requirements_check gcc patch curl zlib libreadline-devel autoconf automake diffutils make libtool bison sqlite3 git
      requirements_alt_define_openssl "$1"
      ;;
    (*)
      requirements_check gcc patch curl zlib libreadline-devel autoconf automake diffutils make libtool bison sqlite3
      requirements_alt_define_openssl "$1"
      ;;
  esac
}

requirements_alt_service()
{
  systemctl $1 $3 >/dev/null ||
  if __rvm_try_sudo systemctl $2 $3
  then true
  else
    \typeset __alt_status=$?
    rvm_error "There was a problem running 'systemctl $2 $3' with exit status '$__alt_status'."
    return $__alt_status
  fi
}
