#!/usr/bin/env bash
# Copyright (c) HashiCorp, Inc.
# SPDX-License-Identifier: BUSL-1.1

set -e

fail() {
  echo "$1" 1>&2
  exit 1
}

[[ -z "${PACKAGE_MANAGER}" ]] && fail "PACKAGE_MANAGER env variable has not been set"
[[ -z "${RETRY_INTERVAL}" ]] && fail "RETRY_INTERVAL env variable has not been set"
[[ -z "${TIMEOUT_SECONDS}" ]] && fail "TIMEOUT_SECONDS env variable has not been set"

# Add any repositories that have have been passed in
add_repos() {
  # If we don't have any repos on the list for this distro, no action needed.
  if [ ${#DISTRO_REPOS[@]} -lt 1 ]; then
    echo "DISTRO_REPOS is empty; No repos required for the packages for this Linux distro."
    return 0
  fi

  case $PACKAGE_MANAGER in
    apt)
      # NOTE: We do not currently add any apt repositories in our scenarios. I suspect if that time
      # comes we'll need to add support for apt-key here.
      for repo in ${DISTRO_REPOS}; do
        if [ "$repo" == "__none" ]; then
          continue
        fi
        sudo add-apt-repository "${repo}"
      done
      ;;
    dnf)
      for repo in ${DISTRO_REPOS}; do
        if [ "$repo" == "__none" ]; then
          continue
        fi
        sudo dnf install -y "${repo}"
        sudo dnf makecache -y
      done
      ;;
    yum)
      for repo in ${DISTRO_REPOS}; do
        if [ "$repo" == "__none" ]; then
          continue
        fi
        sudo yum install -y "${repo}"
        sudo yum makecache -y
      done
      ;;
    zypper)
      # Add each repo
      for repo in ${DISTRO_REPOS}; do
        if [ "$repo" == "__none" ]; then
          continue
        fi
        if sudo zypper lr "${repo}"; then
          echo "A repo named ${repo} already exists, skipping..."
          continue
        fi
        sudo zypper --gpg-auto-import-keys --non-interactive addrepo "${repo}"
      done
      sudo zypper --gpg-auto-import-keys ref
      sudo zypper --gpg-auto-import-keys refs
      ;;
    *)
      fail "Unsupported package manager: ${PACKAGE_MANAGER}"
      ;;
  esac
}

begin_time=$(date +%s)
end_time=$((begin_time + TIMEOUT_SECONDS))
while [ "$(date +%s)" -lt "$end_time" ]; do
  if add_repos; then
    exit 0
  fi

  sleep "$RETRY_INTERVAL"
done

fail "Timed out waiting for distro repos to be set up"
