#!/usr/bin/env bash

# This script is currently used by .github/workflows/release.yml to release Kong to Pulp.
set -eo pipefail

source .requirements

KONG_VERSION=$(bash scripts/grep-kong-version.sh)
KONG_RELEASE_LABEL=${KONG_RELEASE_LABEL:-$KONG_VERSION}

# allow package name (from .requirements) to be overridden by ENV
KONG_PACKAGE_NAME="${KONG_PACKAGE_NAME_OVERRIDE:-${KONG_PACKAGE_NAME}}"

RELEASE_SCRIPT_DOCKER_IMAGE="kong/release-script"

# Variables used by the release script
ARCHITECTURE=${ARCHITECTURE:-amd64}
PACKAGE_TYPE=${PACKAGE_TYPE:-deb}
ARTIFACT_TYPE=${ARTIFACT_TYPE:-debian}

ARTIFACT_PREFIX=${ARTIFACT_PREFIX:-"bazel-bin/pkg"}
ARTIFACT=${ARTIFACT:-"kong.deb"}
ARTIFACT_VERSION=${ARTIFACT_VERSION:-}

KONG_ARTIFACT=$ARTIFACT_PREFIX/$ARTIFACT

# Retries a command a configurable number of times with backoff.
#
# The retry count is given by ATTEMPTS (default 5), the initial backoff
# timeout is given by TIMEOUT in seconds (default 1.)
#
# Successive backoffs double the timeout.
function with_backoff {
  local max_attempts=${ATTEMPTS-5}
  local timeout=${TIMEOUT-5}
  local attempt=1
  local exitCode=0

  while (( $attempt < $max_attempts ))
  do
    if "$@"
    then
      return 0
    else
      exitCode=$?
    fi

    echo "Failure! Retrying in $timeout.." 1>&2
    sleep $timeout
    attempt=$(( attempt + 1 ))
    timeout=$(( timeout * 2 ))
  done

  if [[ $exitCode != 0 ]]
  then
    echo "You've failed me for the last time! ($*)" 1>&2
  fi

  return $exitCode
}

# TODO: remove this once we have a better way to determine if we are releasing
case "$ARTIFACT_TYPE" in
  debian|ubuntu)
    OUTPUT_FILE_SUFFIX=".$ARTIFACT_VERSION.$ARCHITECTURE.deb"
    ;;
  rhel)
    OUTPUT_FILE_SUFFIX=".rhel$ARTIFACT_VERSION.$ARCHITECTURE.rpm"
    ;;
  alpine)
    OUTPUT_FILE_SUFFIX=".$ARCHITECTURE.apk.tar.gz"
    ;;
  amazonlinux)
    OUTPUT_FILE_SUFFIX=".aws.$ARCHITECTURE.rpm"
    ;;
  src)
    OUTPUT_FILE_SUFFIX=".tar.gz"
    ;;
esac


DIST_FILE="$KONG_PACKAGE_NAME-$KONG_RELEASE_LABEL$OUTPUT_FILE_SUFFIX"

function push_package () {

  local dist_version="--dist-version $ARTIFACT_VERSION"

  # TODO: CE gateway-src

  if [ "$ARTIFACT_VERSION" == "18.04" ]; then
    dist_version="--dist-version bionic"
  fi
  if [ "$ARTIFACT_VERSION" == "20.04" ]; then
    dist_version="--dist-version focal"
  fi
  if [ "$ARTIFACT_VERSION" == "22.04" ]; then
    dist_version="--dist-version jammy"
  fi
  if [ "$ARTIFACT_VERSION" == "24.04" ]; then
    dist_version="--dist-version noble"
  fi

  tags="$PACKAGE_TAGS"
  echo "tags passed to script: ${tags}"
  tags="${tags//${KONG_RELEASE_LABEL}-/}"
  tags="${tags//${KONG_RELEASE_LABEL}+/}"
  echo "became:                ${tags}"
  leftovers="$(echo "$tags" | tr -d 'a-zA-Z0-9._,')"
  echo "after sanitizing:      ${leftovers}"

  # test for sanitized github actions input
  if [ -n "$leftovers" ]; then
    echo 'invalid characters in PACKAGE_TAGS'
    tags=''
  fi

  set -x
  release_args=''

  if [ -n "${tags:-}" ]; then
    release_args="${release_args} --tags ${tags}"
  fi

  release_args="${release_args} --package-type gateway"
  if [[ "$EDITION" == "enterprise" ]]; then
    release_args="${release_args} --enterprise"
  fi

  # pre-releases go to `/internal/`
  if [[ "$OFFICIAL_RELEASE" == "true" ]]; then
    release_args="${release_args} --publish"
  else
    release_args="${release_args} --internal"
  fi

  docker run \
    -e VERBOSE \
    -e CLOUDSMITH_API_KEY \
    -e CLOUDSMITH_DRY_RUN \
    -e IGNORE_CLOUDSMITH_FAILURES \
    -e USE_CLOUDSMITH \
    -v "$(pwd)/$KONG_ARTIFACT:/files/$DIST_FILE" \
    -i $RELEASE_SCRIPT_DOCKER_IMAGE \
          --file "/files/$DIST_FILE" \
          --dist-name "$ARTIFACT_TYPE" $dist_version \
          --major-version "${KONG_VERSION%%.*}.x" \
          $release_args

  if [[ $? -ne 0 ]]; then
    exit 1
  fi
}

with_backoff push_package

echo -e "\nReleasing Kong '$KONG_RELEASE_LABEL' of '$ARTIFACT_TYPE $ARTIFACT_VERSION' done"

exit 0