#!/bin/bash

set -euo pipefail

WORKSPACE=$(unset CDPATH && cd $(dirname "${BASH_SOURCE[0]}") && pwd)
CHARTS="$WORKSPACE/../charts"
source "$WORKSPACE/../lib/lib.sh"

VENDOR=${1:-"aws"}
ENV=${2:-"dev"}
REGION=${3:-""}
LOGICAL_REGION=${4:-"$REGION"}
IMAGE_RS=${5:-""}
IMAGE_DS=${6:-""}
ISBYOC=${7:-"false"}
VALUES_FILE=${8:-"$WORKSPACE/regional-server/envs/${ENV}-${VENDOR}-${LOGICAL_REGION}/values.yaml"}
VALUES_TO_APPLY=""

cleanup() {
  if [[ -n "$VALUES_TO_APPLY" && -f "$VALUES_TO_APPLY" ]]; then
    rm -f "$VALUES_TO_APPLY"
  fi
}
trap cleanup EXIT

image_repository() {
  local image="$1"
  if [[ "$image" == *@sha256:* ]]; then
    echo "$image"
  elif [[ "${image##*/}" == *:* ]]; then
    echo "${image%:*}"
  else
    echo "$image"
  fi
}

image_tag() {
  local image="$1"
  if [[ "$image" == *@sha256:* ]]; then
    echo ""
  elif [[ "${image##*/}" == *:* ]]; then
    echo "${image##*:}"
  else
    echo ""
  fi
}

prepare_values_file() {
  if [[ ! -f "$VALUES_FILE" ]]; then
    echo "Error: values file not found: $VALUES_FILE"
    exit 1
  fi
  if ! command -v yq >/dev/null 2>&1; then
    echo "Error: yq is required for deploy image overrides."
    exit 1
  fi

  VALUES_TO_APPLY="$WORKSPACE/.regional-server-values-${ENV}-${VENDOR}-${LOGICAL_REGION}-$$.yaml"
  cp "$VALUES_FILE" "$VALUES_TO_APPLY"

  export IMAGE_RS_REPOSITORY
  export IMAGE_RS_TAG
  export IMAGE_DS_REPOSITORY
  export IMAGE_DS_TAG
  IMAGE_RS_REPOSITORY="$(image_repository "$IMAGE_RS")"
  IMAGE_RS_TAG="$(image_tag "$IMAGE_RS")"
  IMAGE_DS_REPOSITORY="$(image_repository "$IMAGE_DS")"
  IMAGE_DS_TAG="$(image_tag "$IMAGE_DS")"

  yq eval -i '.regionalServer.image.repository = strenv(IMAGE_RS_REPOSITORY)' "$VALUES_TO_APPLY"
  yq eval -i '.regionalServer.image.tag = strenv(IMAGE_RS_TAG)' "$VALUES_TO_APPLY"
  yq eval -i '.dataServer.image.repository = strenv(IMAGE_DS_REPOSITORY)' "$VALUES_TO_APPLY"
  yq eval -i '.dataServer.image.tag = strenv(IMAGE_DS_TAG)' "$VALUES_TO_APPLY"
}

# throw error if any of the required arguments are not set
if [ -z "$VENDOR" ] || [ -z "$ENV" ] || [ -z "$REGION" ] || [ -z "$LOGICAL_REGION" ]; then
  echo "Error: Missing required arguments."
  echo "Usage: $0 <vendor> <env> <region> <logical_region> <image_rs> <image_ds> [is_byoc] [values_file]"
  exit 1
fi

if [[ "${MANAGED_BY_OPS_SERVER:-false}" == "true" ]]; then
  : "${AUTH0_CLIENT_ID:?AUTH0_CLIENT_ID is required for managed ops deploys}"
  : "${AUTH0_CLIENT_SECRET:?AUTH0_CLIENT_SECRET is required for managed ops deploys}"
  if [[ -z "$IMAGE_RS" || -z "$IMAGE_DS" ]]; then
    echo "Error: IMAGE_RS and IMAGE_DS are required for managed regional-server deploys."
    echo "Usage: $0 <vendor> <env> <region> <logical_region> <image_rs> <image_ds> [is_byoc] [values_file]"
    exit 1
  fi
  prepare_values_file

  bash "$WORKSPACE/deploy-with-ops.sh" "$VENDOR" "$ENV" "$REGION" "$LOGICAL_REGION" "$VALUES_TO_APPLY"
  exit 0
fi

# throw error if IMAGE args are not set for direct Helm path
if [ -z "$IMAGE_RS" ] || [ -z "$IMAGE_DS" ]; then
  echo "Error: IMAGE_RS and IMAGE_DS are required."
  echo "Usage: $0 <vendor> <env> <region> <logical_region> <image_rs> <image_ds> [is_byoc] [values_file]"
  exit 1
fi

prepare_values_file
echo "start upgrading regional-server via helm"
helm_adopt_apply regional-server observability "$CHARTS/regional-server" -f "$VALUES_TO_APPLY"
echo "end upgrading regional-server via helm"
