function _install_spack() {
  if [ ! -e ${SPACK_ROOT} ]; then
    echo "Cloning to ${SPACK_ROOT}"
    git clone --depth 1 ${SPACK_URL} -b ${SPACK_BRANCH} ${SPACK_ROOT}
  fi

  _init_spack ${SPACK_INIT_CMD} ${SPACK_ROOT}

  if [[ $(spack compiler info ${SPACK_COMPILER}) ]]; then
    echo "Found Compiler $(spack compiler info ${SPACK_COMPILER})"
  else
    echo "could not find compiler, will now try to install it... this may take a while"
    spack install ${SPACK_COMPILER}
    spack compiler add $(spack location --install-dir $SPACK_COMPILER)
  fi
}

function _init_spack() {
  SPACK_INIT_CMD=$1
  SPACK_ROOT=$2
  if [ -z "$SPACK_INIT_CMD" ] && [ ! -z "${SPACK_ROOT}" ]; then
    echo "Empty SPACK_INIT_CMD -> trying to source config file of spack root: $SPACK_ROOT/share/spack/setup-env.sh"
    . $SPACK_ROOT/share/spack/setup-env.sh
  else
    echo "Executing SPACK_INIT_CMD: $SPACK_INIT_CMD"
    $SPACK_INIT_CMD
  fi
}

function load_spack() {
  export SPACK_INIT_CMD=$1
  export SPACK_ROOT=$2                 # i.e.: spack
  export SPACK_URL=$3                  # i.e.: https://github.com/spack/spack.git
  export SPACK_BRANCH=$4               # i.e.: develop
  export SPACK_COMPILER=$5             # i.e.: gcc@12.2.0
  export SPACK_DISABLE_LOCAL_CONFIG=$6 # i.e.: true
  export SPACK_USER_CACHE_PATH=$7      # i.e.: ${SPACK_ROOT}/spack_user_cache_path
  export SPACK_USER_CONFIG_PATH=$8     # i.e.: ${SPACK_ROOT}/spack_user_config_path

  echo "SPACK_INIT_CMD                = $SPACK_INIT_CMD"
  echo "SPACK_ROOT                    = $SPACK_ROOT"
  echo "SPACK_URL                     = $SPACK_URL"
  echo "SPACK_BRANCH                  = $SPACK_BRANCH"
  echo "SPACK_COMPILER                = $SPACK_COMPILER"
  echo "SPACK_DISABLE_LOCAL_CONFIG    = $SPACK_DISABLE_LOCAL_CONFIG"
  echo "SPACK_USER_CACHE_PATH         = $SPACK_USER_CACHE_PATH"
  echo "SPACK_USER_CONFIG_PATH        = $SPACK_USER_CONFIG_PATH"

  if [ -z "$SPACK_USER_CACHE_PATH" ]; then
    unset SPACK_USER_CACHE_PATH
  fi

  if [ -z "$SPACK_USER_CONFIG_PATH" ]; then
    unset SPACK_USER_CONFIG_PATH
  fi

  if [ ! -e ${SPACK_ROOT} ] && [ ! -z "${SPACK_ROOT}" ]; then _install_spack; fi

  _init_spack "$SPACK_INIT_CMD" "$SPACK_ROOT"

  echo "Using spack from $(which spack)"
}