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

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

CHARTS="$WORKSPACE/../charts"

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

LEGACY_RELEASE_NAME_READ="ingress-nginx"
RELEASE_NAME_READ="ingress-nginx-read"
RELEASE_NAME_WRITE="ingress-nginx-write"
CHART_PATH="$CHARTS/ingress-nginx-v411"
LEGACY_CHART_PATH="$CHARTS/ingress-nginx"
CLUSTER_AUTOSCALER_VERSION=9.46.6
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")

OPS_API_BASE_URL="${O11Y_OPS_API_BASE_URL:-$(resolve_managed_ops_api_base_url "$ENV")}"
prepare_bootstrap_ops_api
OPS_API_BASE_URL="$(resolve_effective_ops_api_base_url "$OPS_API_BASE_URL")"
REGION_ID="${VENDOR}-${REGION}"

echo "start managed upgrading cluster $CLUSTER"
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

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

    if [[ ! -f "$values_file" ]]; then
        echo "skipping ${component}: values file not found: $values_file"
        return 0
    fi

    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
}

if [[ "$VENDOR" == "aws" ]]; then
    echo "start deploying aws load balancer controller via ops API"
    deploy_managed_helmrelease "aws-load-balancer-controller" "kube-system" "aws-load-balancer-controller" \
        "$WORKSPACE/aws-lb-controller/envs/${ENV}-${VENDOR}-${LOGICAL_REGION}/values.yaml" \
        "$(read_chart_version "$CHARTS/aws-load-balancer-controller")"
    echo "end deploying aws load balancer controller via ops API"

    external_dns_values="$WORKSPACE/external-dns/envs/${ENV}-${VENDOR}-${LOGICAL_REGION}/values.yaml"
    if [[ -f "$external_dns_values" ]]; then
        echo "start deploying external-dns via ops API"
        deploy_managed_helmrelease "external-dns" "kube-system" "external-dns" \
            "$external_dns_values" \
            "$(read_chart_version "$CHARTS/external-dns")"
        echo "end deploying external-dns via ops API"
    else
        echo "skip external-dns: no values file for ${ENV}-${VENDOR}-${LOGICAL_REGION}"
    fi

    echo "start deploying cluster-autoscaler via ops API"
    deploy_managed_helmrelease "cluster-autoscaler" "kube-system" "cluster-autoscaler" \
        "$WORKSPACE/cluster-autoscaler/envs/${ENV}-${VENDOR}-${LOGICAL_REGION}/values.yaml" \
        "$CLUSTER_AUTOSCALER_VERSION"
    echo "end deploying cluster-autoscaler via ops API"
fi

agic_values_file="$WORKSPACE/agic/envs/${ENV}-${VENDOR}-${LOGICAL_REGION}/values.yaml"
if [[ "$VENDOR" == "azure" && -f "$agic_values_file" ]]; then
    echo "start deploying agic via ops API"
    deploy_managed_helmrelease "ingress-azure" "kube-system" "ingress-azure" \
        "$agic_values_file" \
        "1.9.8"
    echo "end deploying agic via ops API"
fi

echo "start deploying ingress-nginx-write via ops API"
deploy_managed_helmrelease "$RELEASE_NAME_WRITE" "kube-system" "ingress-nginx" \
    "$WORKSPACE/ingress-nginx-write/envs/${ENV}-${VENDOR}-${LOGICAL_REGION}/values.yaml" \
    "$(read_chart_version "$CHART_PATH")"
echo "end deploying ingress-nginx-write via ops API"

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

echo "start deploying ${RELEASE_NAME_READ} via ops API"
read_namespace="kube-system"
if [[ "$VENDOR" == "azure" ]]; then
    read_namespace="observability"
fi
deploy_managed_helmrelease "$RELEASE_NAME_READ" "$read_namespace" "ingress-nginx" \
    "$WORKSPACE/ingress-nginx-read/envs/${ENV}-${VENDOR}-${LOGICAL_REGION}/values.yaml" \
    "$(read_chart_version "$CHART_PATH")"
echo "end deploying ${RELEASE_NAME_READ} via ops API"

echo "end managed upgrading with context ${CLUSTER}"
