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

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

MODE=${1:-"regional"}
ENV=${2:-"dev"}
CLUSTER=${3:-}
REGION=${4:-""}
LOGICAL_REGION=${5:-""}
VENDOR=${6:-"aws"}

if [[ "$MODE" == "regional" && "${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" "$MODE" "$ENV" "$CLUSTER" "$REGION" "$LOGICAL_REGION" "$VENDOR"
  exit 0
fi

CHARTS="$WORKSPACE/../charts"
DASHBOARD_DIR="$WORKSPACE/manifests/dashboards"

VM_OPERATOR_CHART_VERSION=0.51.4
# Optional per-region chart version override, e.g. for a staged vm-operator upgrade
# of a single region without affecting others.
VM_OPERATOR_VERSION_FILE="$WORKSPACE/vm-operator/envs/${ENV}/regional-${VENDOR}-${LOGICAL_REGION}.chart-version"
if [[ -f "$VM_OPERATOR_VERSION_FILE" ]]; then
  VM_OPERATOR_CHART_VERSION=$(tr -d '[:space:]' < "$VM_OPERATOR_VERSION_FILE")
  echo "using per-region vm-operator chart version ${VM_OPERATOR_CHART_VERSION} from ${VM_OPERATOR_VERSION_FILE}"
fi

deploy_o11y_mixin() {
  echo "start upgrading o11y-mixin o11y mixin charts"
  MIXIN_VALUE_ARGS=(-f "$MIXIN_VALUES")
  MIXIN_ENV_VALUES="$WORKSPACE/o11y-mixin/envs/${ENV}/regional-${VENDOR}-${LOGICAL_REGION}.yaml"
  if [[ "$MODE" == "regional" && -f "$MIXIN_ENV_VALUES" ]]; then
    echo "using o11y-mixin regional values override: $MIXIN_ENV_VALUES"
    MIXIN_VALUE_ARGS+=(-f "$MIXIN_ENV_VALUES")
  fi
  helm_adopt_apply o11y-mixin self-monitoring "$CHARTS/o11y-mixin" "${MIXIN_VALUE_ARGS[@]}"
  echo "end upgrading self-monitoring o11y mixin charts"
}

echo "start upgrading cluster $CLUSTER"
case "$MODE" in
  global)
    PROM_VALUES="$WORKSPACE/kube-prometheus-stack/envs/${ENV}/global-aws-us-west-2.yaml"
    helm repo add external-secrets https://charts.external-secrets.io
    helm upgrade --version 0.18.2 -i external-secrets external-secrets/external-secrets -n external-secrets --create-namespace -f external-secret/envs/${ENV}-global-aws-us-west-2.yaml
    CLIENT_ID=${DEV_GRAFANA_CLIENT_ID}
    CLIENT_SECRET=${DEV_GRAFANA_CLIENT_SECRET}
    if [[ $ENV == "staging" ]]; then
    CLIENT_ID=${STAGING_GRAFANA_CLIENT_ID}
    CLIENT_SECRET=${STAGING_GRAFANA_CLIENT_SECRET}
    elif [[ $ENV == "prod" ]]; then
    CLIENT_ID=${GRAFANA_CLIENT_ID}
    CLIENT_SECRET=${GRAFANA_CLIENT_SECRET}
    fi
    sed -i "s/client_id: _/client_id: $CLIENT_ID/" "$PROM_VALUES"
    sed -i "s/client_secret: _/client_secret: $CLIENT_SECRET/" $PROM_VALUES
    MIXIN_VALUES="$CHARTS/o11y-mixin/values-global.yaml"
    ;;
  *)
    PROM_VALUES="$WORKSPACE/kube-prometheus-stack/envs/${ENV}/regional-${VENDOR}-${LOGICAL_REGION}.yaml"
    MIXIN_VALUES="$CHARTS/o11y-mixin/values-${VENDOR}.yaml"
    ;;
esac

echo "start upgrading kube prometheus stack"
helm upgrade -i --create-namespace self-monitoring -n self-monitoring \
    -f $PROM_VALUES $CHARTS/kube-prometheus-stack
echo "end upgrading kube prometheus stack"


if [[ $MODE == "regional" ]]; then

  if [[ "$VENDOR" == "alicloud" && "$REGION" != "na-south-1" ]]; then
    echo "start upgrading external-secret"
    kubectl create namespace observability --dry-run=client -o yaml | kubectl apply -f -
    kubectl create namespace cluster-backup --dry-run=client -o yaml | kubectl apply -f -
    kubectl apply -f $WORKSPACE/external-secret/envs/${ENV}-${VENDOR}-${LOGICAL_REGION}.yaml
  fi

  if [[ "$VENDOR" != "gcp" ]]; then
    echo "start upgrading cert-manager"
    helm_adopt_apply cert-manager kube-system "$CHARTS/cert-manager" -f "$WORKSPACE/cert-manager/envs/${ENV}/regional-${VENDOR}-${LOGICAL_REGION}.yaml"
    echo "end upgrading cert-manager"
  fi

  # Issuers moved into o11y-mixin so they render only after cert-manager CRDs and webhook are ready.
  deploy_o11y_mixin

    # echo "start upgrading external-dns"
    # helm upgrade -i --create-namespace external-dns -n kube-system \
    #   -f $WORKSPACE/external-dns/envs/${ENV}/regional-${VENDOR}-${LOGICAL_REGION}.yaml \
    #   $CHARTS/external-dns
    # echo "end upgrading external-dns"


  echo "start upgrading vm-operator"
  helm repo add victoriametrics https://victoriametrics.github.io/helm-charts/
  helm repo update
  helm upgrade -i --create-namespace --version ${VM_OPERATOR_CHART_VERSION} victoria-metrics-operator -n self-monitoring \
    -f $WORKSPACE/vm-operator/envs/${ENV}/regional-${VENDOR}-${LOGICAL_REGION}.yaml \
    victoriametrics/victoria-metrics-operator
  echo "end upgrading vm-operator"

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

  echo "start upgrading volume-autoscaler"
  helm upgrade -i --create-namespace --debug -n self-monitoring -f $WORKSPACE/volume-autoscaler/envs/${ENV}/regional-${VENDOR}-${LOGICAL_REGION}.yaml volume-autoscaler $CHARTS/volume-autoscaler
  echo "end upgrading volume-autoscaler"

  echo "start upgrading vector"
  helm upgrade -i --create-namespace --debug -n self-monitoring -f $WORKSPACE/vector/envs/${ENV}/regional-${VENDOR}-${LOGICAL_REGION}.yaml self-vector $CHARTS/vector
  echo "end upgrading vector"

  echo "start upgrading cluster-backup velero "
  # Check if the velero config file exists for this environment, vendor and region before attempting to install
  if [[ -f "$WORKSPACE/velero/envs/${ENV}/regional-${VENDOR}-${LOGICAL_REGION}.yaml" ]]; then
    # Uninstall velero if it exists and chart version < 10
    if helm status velero -n cluster-backup &>/dev/null; then
      VELERO_CHART_VERSION=$(helm list -n cluster-backup -o json | jq -r '.[] | select(.name=="velero") | .chart' | sed -E 's/velero-([0-9]+).*/\1/')
      if [[ -n "$VELERO_CHART_VERSION" && "$VELERO_CHART_VERSION" -lt 10 ]]; then
        echo "Velero chart version ${VELERO_CHART_VERSION} < 10, uninstalling and cleaning up CRDs"
        helm uninstall velero -n cluster-backup
        kubectl delete crd backups.velero.io backupstoragelocations.velero.io deletebackuprequests.velero.io downloadrequests.velero.io podvolumebackups.velero.io podvolumerestores.velero.io resticrepositories.velero.io restores.velero.io schedules.velero.io serverstatusrequests.velero.io volumesnapshotlocations.velero.io
      fi
    fi
    helm upgrade -i --create-namespace --debug -n cluster-backup -f "$WORKSPACE/velero/envs/${ENV}/regional-${VENDOR}-${LOGICAL_REGION}.yaml" velero $CHARTS/velero
  fi
  echo "end upgrading cluster-backup velero"

fi

echo "end upgrading with context ${CLUSTER}"
