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

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

CHARTS="$WORKSPACE/../charts"
DASHBOARD_DIR="$WORKSPACE/manifests/dashboards"
VM_OPERATOR_CHART_VERSION=0.51.4
MIXIN_MERGED_VALUES=""

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

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

echo "start upgrading cluster $CLUSTER"
DEFAULT_OPS_API_BASE_URL="${O11Y_OPS_API_BASE_URL:-$(resolve_managed_ops_api_base_url "$ENV")}"
OPS_API_BASE_URL="$DEFAULT_OPS_API_BASE_URL"
REGION_ID="${VENDOR}-${REGION}"

deploy_managed_helmrelease() {
    local name="$1"
    local namespace="$2"
    local component="$3"
    local values_file="$4"
    local version="$5"

    if ! create_or_update_helmrelease "${OPS_API_BASE_URL}" "$name" "$namespace" "$component" "$values_file" "$version" "$REGION_ID" "$LOGICAL_REGION"; then
        echo "Failed to deploy ${component}"
        exit 1
    fi

    if ! wait_for_helmrelease_ready "${OPS_API_BASE_URL}" "$name" "$REGION_ID" "$LOGICAL_REGION"; then
        echo "Failed waiting for ${name} to become Ready"
        exit 1
    fi
}

OPS_SERVER_VALUES="$WORKSPACE/ops-server/envs/${ENV}/regional-${VENDOR}-${LOGICAL_REGION}.yaml"
if [[ ! -f "$OPS_SERVER_VALUES" ]]; then
    echo "Error: ops-server values file not found: $OPS_SERVER_VALUES"
    exit 1
fi
OPS_SERVER_VERSION="$(read_chart_version "$CHARTS/ops-server")"

if [[ "${SKIP_CLUSTER_ACCESS:-false}" == "true" ]]; then
    echo "skipping ops-server bootstrap because cluster access is disabled"
elif should_bootstrap_managed_deploy; then
    echo "bootstrapping ops-server before managed deploy"
    bash "$WORKSPACE/bootstrap-ops-server.sh" "$MODE" "$ENV" "$CLUSTER" "$REGION" "$LOGICAL_REGION" "$VENDOR"
else
    echo "ops-server HelmRelease already exists; updating through managed API"
fi

prepare_bootstrap_ops_api
OPS_API_BASE_URL="$(resolve_effective_ops_api_base_url "$DEFAULT_OPS_API_BASE_URL")"
if [[ "${BOOTSTRAP:-false}" == "true" ]]; then
    echo "using bootstrap local ops API base URL: $OPS_API_BASE_URL"
else
    echo "using globalserver ops API base URL: $OPS_API_BASE_URL"
fi

echo "start deploying ops-server via ops API"
deploy_managed_helmrelease "ops-server" "ops-system" "ops-server" "$OPS_SERVER_VALUES" "$OPS_SERVER_VERSION"
echo "end deploying ops-server via ops API"

echo "start deploying kube-prometheus-stack via ops API"
PROM_VALUES="$WORKSPACE/kube-prometheus-stack/envs/${ENV}/regional-${VENDOR}-${LOGICAL_REGION}.yaml"
PROM_VERSION="$(read_chart_version "$CHARTS/kube-prometheus-stack")"
deploy_managed_helmrelease "self-monitoring" "self-monitoring" "kube-prometheus-stack" "$PROM_VALUES" "$PROM_VERSION"
echo "end deploying kube-prometheus-stack via ops API"

echo "start deploying cert-manager via ops API"
CERT_MANAGER_VALUES="$WORKSPACE/cert-manager/envs/${ENV}/regional-${VENDOR}-${LOGICAL_REGION}.yaml"
CERT_MANAGER_VERSION="$(read_chart_version "$CHARTS/cert-manager")"
CERT_MANAGER_NAMESPACE="kube-system"
if [[ "$VENDOR" == "azure" ]]; then
    CERT_MANAGER_NAMESPACE="cert-manager"
fi
deploy_managed_helmrelease "cert-manager" "$CERT_MANAGER_NAMESPACE" "cert-manager" "$CERT_MANAGER_VALUES" "$CERT_MANAGER_VERSION"
echo "end deploying cert-manager via ops API"

echo "start deploying o11y-mixin via ops API"
MIXIN_VALUES="$CHARTS/o11y-mixin/values-${VENDOR}.yaml"
MIXIN_VERSION="$(read_chart_version "$CHARTS/o11y-mixin")"
deploy_managed_helmrelease "self-monitoring-o11y-mixin" "self-monitoring" "o11y-mixin" "$MIXIN_VALUES" "$MIXIN_VERSION"
echo "end deploying o11y-mixin via ops API"

echo "start deploying victoria-metrics-operator via ops API"
VM_OPERATOR_VALUES="$WORKSPACE/vm-operator/envs/${ENV}/regional-${VENDOR}-${LOGICAL_REGION}.yaml"
# 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_managed_helmrelease "victoria-metrics-operator" "self-monitoring" "victoria-metrics-operator" "$VM_OPERATOR_VALUES" "$VM_OPERATOR_CHART_VERSION"
echo "end deploying victoria-metrics-operator via ops API"

echo "start deploying eventrouter via ops API"
EVENTROUTER_VALUES="$WORKSPACE/eventrouter/envs/${ENV}/regional-${VENDOR}-${LOGICAL_REGION}.yaml"
if [[ ! -f "$EVENTROUTER_VALUES" ]]; then
    EVENTROUTER_VALUES="$CHARTS/eventrouter/values.yaml"
fi
EVENTROUTER_VERSION="$(read_chart_version "$CHARTS/eventrouter")"
deploy_managed_helmrelease "eventrouter" "kube-system" "eventrouter" "$EVENTROUTER_VALUES" "$EVENTROUTER_VERSION"
echo "end deploying eventrouter via ops API"

echo "start deploying volume-autoscaler via ops API"
VOLUME_AUTOSCALER_VALUES="$WORKSPACE/volume-autoscaler/envs/${ENV}/regional-${VENDOR}-${LOGICAL_REGION}.yaml"
VOLUME_AUTOSCALER_VERSION="$(read_chart_version "$CHARTS/volume-autoscaler")"
deploy_managed_helmrelease "volume-autoscaler" "self-monitoring" "volume-autoscaler" "$VOLUME_AUTOSCALER_VALUES" "$VOLUME_AUTOSCALER_VERSION"
echo "end deploying volume-autoscaler via ops API"

echo "start deploying vector via ops API"
VECTOR_VALUES="$WORKSPACE/vector/envs/${ENV}/regional-${VENDOR}-${LOGICAL_REGION}.yaml"
VECTOR_VERSION="$(read_chart_version "$CHARTS/vector")"
deploy_managed_helmrelease "self-vector" "self-monitoring" "vector" "$VECTOR_VALUES" "$VECTOR_VERSION"
echo "end deploying vector via ops API"

VELERO_VALUES="$WORKSPACE/velero/envs/${ENV}/regional-${VENDOR}-${LOGICAL_REGION}.yaml"
if [[ -f "$VELERO_VALUES" ]]; then
    echo "start deploying velero via ops API"
    VELERO_VERSION="$(read_chart_version "$CHARTS/velero")"
    deploy_managed_helmrelease "velero" "cluster-backup" "velero" "$VELERO_VALUES" "$VELERO_VERSION"
    echo "end deploying velero via ops API"
else
    echo "skipping velero via ops API: values file not found: $VELERO_VALUES"
fi
