#!/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"}
ISBYOC=${5:-"false"}

# throw error if any of the 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>"
  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}"
  bash "$WORKSPACE/deploy-with-ops.sh" "$VENDOR" "$ENV" "$REGION" "$LOGICAL_REGION" "$ISBYOC"
  exit 0
fi

# create namespace observability if not exists
kubectl create namespace observability --dry-run=client -o yaml | kubectl apply -f -

# For alicloud, ensure pod-identity label is set on observability namespace
if [[ "$VENDOR" == "alicloud" ]]; then
  current_label=$(kubectl get namespace observability -o jsonpath='{.metadata.labels.pod-identity\.alibabacloud\.com/injection}' 2>/dev/null || echo "")
  if [[ "$current_label" != "on" ]]; then
    echo "Adding pod-identity label to observability namespace"
    kubectl label namespace observability pod-identity.alibabacloud.com/injection=on --overwrite
  fi
fi

echo "start upgrading vmcluster"
vmcluster_env_dir="$WORKSPACE/vmcluster/envs/${ENV}-${VENDOR}-${LOGICAL_REGION}"
vmcluster_values="$vmcluster_env_dir/values.yaml"
vmcluster_deployed_from_values=false
if [[ -f "$vmcluster_values" ]]; then
  helm_adopt_apply vmcluster observability "$CHARTS/vmcluster" -f "$vmcluster_values"
  vmcluster_deployed_from_values=true
elif [ -d "$vmcluster_env_dir/" ]; then
  kubectl apply -f "$vmcluster_env_dir/"
else
  echo "Directory $vmcluster_env_dir/ does not exist. Skipping."
fi
echo "end upgrading vmcluster"

# start to apply next gen ingress
echo "start upgrading dataplane ingress"
# test if the envs directory exists
if [[ "$vmcluster_deployed_from_values" == "true" ]]; then
  echo "vmcluster values.yaml exists. Skipping separate dataplane ingress deploy."
elif [ -d "$WORKSPACE/dataplane-ingress/envs/${ENV}-${VENDOR}-${LOGICAL_REGION}" ]; then
  kubectl apply -f $WORKSPACE/dataplane-ingress/envs/${ENV}-${VENDOR}-${LOGICAL_REGION}/
else
  echo "Directory $WORKSPACE/dataplane-ingress/envs/${ENV}-${VENDOR}-${LOGICAL_REGION} does not exist. Skipping."
fi
echo "end upgrading dataplane ingress"


echo "start upgrading loki-ha"
loki_version="6.29.0"
# Optional per-region chart version override, e.g. for a staged loki upgrade
# of a single region without affecting others.
loki_version_file="$WORKSPACE/loki/envs/${ENV}-${VENDOR}-${LOGICAL_REGION}/chart-version"
if [[ -f "$loki_version_file" ]]; then
  loki_version=$(tr -d '[:space:]' < "$loki_version_file")
  echo "using per-region loki chart version ${loki_version} from ${loki_version_file}"
fi
loki_values="$WORKSPACE/loki/envs/${ENV}-${VENDOR}-${LOGICAL_REGION}/values.yaml"
loki_ingress="$WORKSPACE/loki/envs/${ENV}-${VENDOR}-${LOGICAL_REGION}/ingress.yaml"
loki_storageclass="$WORKSPACE/loki/common/${VENDOR}/storageclass.yaml"
loki_alerting_rules="$WORKSPACE/loki/common/loki-alerting-rules.yaml"
# only create if not exists
kubectl create -f "$loki_alerting_rules" -n observability 2>/dev/null || true

helm repo add grafana https://grafana.github.io/helm-charts
helm repo update grafana
helm upgrade -i --create-namespace --debug loki-ha grafana/loki \
    --version $loki_version \
    -n observability \
    -f "$loki_values"
if [[ -f "$loki_ingress" ]]; then
    kubectl apply -f "$loki_ingress"
fi
if [[ -f "$loki_storageclass" ]]; then
    kubectl apply -f "$loki_storageclass"
fi
echo "end upgrading loki-ha"

echo "start upgrading user alertmanager"
if [ -d "$WORKSPACE/alertmanager/envs/${ENV}-${VENDOR}-${LOGICAL_REGION}" ]; then
  helm upgrade -i --create-namespace --debug alertmanager-regional $CHARTS/alertmanager \
      -n default \
      -f $WORKSPACE/alertmanager/envs/${ENV}-${VENDOR}-${LOGICAL_REGION}/values.yaml
else
  echo "Directory $WORKSPACE/alertmanager/envs/${ENV}-${VENDOR}-${LOGICAL_REGION} does not exist. Skipping."
fi
echo "end upgrading user alertmanager"

# should be deployed after loki and vmcluster.
# echo "start upgrading sli-reporter"
# kubectl apply -f $WORKSPACE/sli-reporter/envs/${ENV}-${VENDOR}-${LOGICAL_REGION}/
# echo "end upgrading sli-reporter"
