#!/usr/bin/env bash
set -euo pipefail

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

if [[ "${1:-}" == "aws" || "${1:-}" == "gcp" || "${1:-}" == "azure" || "${1:-}" == "alicloud" ]]; then
  VENDOR=${1}
  ENV=${2:-"dev"}
  REGION=${3:-""}
  LOGICAL_REGION=${4:-"$REGION"}
  CLUSTER=${5:-""}
else
  ENV=${1:-"dev"}
  CLUSTER=${2:-""}
  REGION=${3:-""}
  LOGICAL_REGION=${4:-"$REGION"}
  VENDOR=${5:-"aws"}
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}"
  bash "$WORKSPACE/deploy-with-ops.sh" "$VENDOR" "$ENV" "$REGION" "$LOGICAL_REGION" "$CLUSTER"
  exit 0
fi

LEGACY_RELEASE_NAME_READ="ingress-nginx"
RELEASE_NAME_READ="ingress-nginx-read"

RELEASE_NAME_WRITE="ingress-nginx-write"

CHART_PATH_ALICLOUD="$CHARTS/ingress-nginx-v411"
CHART_PATH="$CHARTS/ingress-nginx-v411"
LEGACY_CHART_PATH="$CHARTS/ingress-nginx"

LEGACYLIST=("us-west-2" "us-east-1" "eu-central-1" "us-west-2" "ap-northeast-1" "ap-northeast-2" "ap-south-1" "ap-southeast-1" "asia-east1" "asia-east2" "asia-northeast1" "asia-southeast1" "us-central1" "us-east4" "us-west1")

# Note: the new regions deployed by the auto-deploy script is using "ingress-nginx-read" as the release name
# dev is using "ingress-nginx-read"

if [[ " ${LEGACYLIST[*]} " =~ " ${LOGICAL_REGION} " && $ENV != "dev" && $VENDOR != "alicloud" ]]; then
  RELEASE_NAME_READ=$LEGACY_RELEASE_NAME_READ
  CHART_PATH=$LEGACY_CHART_PATH
fi

# Note: the alicloud regions are using a different version of helm chart.
if [[ $VENDOR == "alicloud" ]]; then
  # deploy alb config and private key secret
  SECRET_NAME="ingress-read-controller"
  NAMESPACE="kube-system"
  kubectl apply -f $WORKSPACE/ingress-nginx-read/envs/${ENV}-${VENDOR}-${LOGICAL_REGION}/albconfig.yaml
  if kubectl get secret "$SECRET_NAME" -n "$NAMESPACE" >/dev/null 2>&1; then
    echo "Secret $SECRET_NAME already exists in namespace $NAMESPACE. Skipping apply."
  else
    echo "Secret $SECRET_NAME does not exist in namespace $NAMESPACE. Applying..."
    kubectl apply -f $WORKSPACE/ingress-nginx-read/envs/${ENV}-${VENDOR}-${LOGICAL_REGION}/privatekey.yaml
  fi
fi

if [[ $VENDOR == "aws" ]]; then
  echo "start upgrading aws lb controller"
	if [ -d "$WORKSPACE/aws-lb-controller/envs/${ENV}-${VENDOR}-${LOGICAL_REGION}" ];then
		helm upgrade --debug --wait -i aws-load-balancer-controller $CHARTS/aws-load-balancer-controller \
			--create-namespace -n kube-system \
			-f $WORKSPACE/aws-lb-controller/envs/${ENV}-${VENDOR}-${LOGICAL_REGION}/values.yaml
		echo "end upgrading aws lb controller"
	fi

  echo "start upgrading external-dns"
	if [ -d "$WORKSPACE/external-dns/envs/${ENV}-${VENDOR}-${LOGICAL_REGION}" ];then
		helm upgrade --debug -i external-dns $CHARTS/external-dns \
			--create-namespace -n kube-system \
			-f $WORKSPACE/external-dns/envs/${ENV}-${VENDOR}-${LOGICAL_REGION}/values.yaml
		echo "end upgrading external-dns"
	fi

  echo "start upgrading cluster-autoscaler"
  cluster_autoscaler_values="$WORKSPACE/cluster-autoscaler/envs/${ENV}-${VENDOR}-${LOGICAL_REGION}/values.yaml"
  if [[ -f "$cluster_autoscaler_values" ]]; then
    helm repo add autoscaler https://kubernetes.github.io/autoscaler
    helm repo update
    helm upgrade -i cluster-autoscaler autoscaler/cluster-autoscaler \
      --create-namespace -n kube-system \
      --version 9.46.6 \
      -f "$cluster_autoscaler_values"
  else
    echo "cluster-autoscaler values file $cluster_autoscaler_values does not exist. Skipping."
  fi

  echo "end upgrading cluster-autoscaler"
fi

if [ -d "$WORKSPACE/agic/envs/${ENV}-${VENDOR}-${LOGICAL_REGION}" ]; then
  echo "Error: AGIC must be deployed via ops-server. Set MANAGED_BY_OPS_SERVER=true for ${ENV}-${VENDOR}-${LOGICAL_REGION}."
  exit 1
fi

# if nginx-write values folder is present, upgrade it
if [ -d "$WORKSPACE/ingress-nginx-write/envs/${ENV}-${VENDOR}-${LOGICAL_REGION}" ]; then
  echo "start upgrading ingress-nginx-write"
  helm_adopt_apply "$RELEASE_NAME_WRITE" kube-system "$CHART_PATH" --wait \
    -f "$WORKSPACE/ingress-nginx-write/envs/${ENV}-${VENDOR}-${LOGICAL_REGION}/values.yaml"
  echo "end upgrading ingress-nginx-write"
fi

# if nginx-read values folder is present, upgrade it
if [ -d "$WORKSPACE/ingress-nginx-read/envs/${ENV}-${VENDOR}-${LOGICAL_REGION}" ]; then
  echo "start upgrading ingress-nginx-read"
	if [[ $VENDOR == "azure" ]]; then
		namespace="observability"
	else
		namespace="kube-system"
	fi
  helm_adopt_apply "$RELEASE_NAME_READ" "$namespace" "$CHART_PATH" --wait \
    -f "$WORKSPACE/ingress-nginx-read/envs/${ENV}-${VENDOR}-${LOGICAL_REGION}/values.yaml"
  if [ -f "$WORKSPACE/ingress-nginx-read/envs/${ENV}-${VENDOR}-${LOGICAL_REGION}/ingress.yaml" ]; then
    kubectl apply -f $WORKSPACE/ingress-nginx-read/envs/${ENV}-${VENDOR}-${LOGICAL_REGION}/ingress.yaml
  fi
  echo "end upgrading ingress-nginx-read"
fi


echo "end upgrading with context ${CLUSTER}"
