#!/usr/bin/env bash

set -xeuo pipefail

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

remote_config=${CONFIG_PATH}
local_config=/tmp/base-config.yaml

bucket_name=${remote_config#s3://}
bucket_name=${bucket_name%%/*}
output_bucket_region=$(aws s3api get-bucket-location --bucket=$bucket_name --query="LocationConstraint" \
  --region=us-west-2 --output=text --no-cli-pager)
aws s3 cp "${remote_config}" "${local_config}" --region=$output_bucket_region

argocd_repo=tidbcloud/app-delivery
cloud=$(yq '.cloudProvider' "${local_config}")
env=$(yq '.env' "${local_config}")
region=$(yq '.region' "${local_config}")
logicalRegionName=$(yq '.name' "${local_config}")
cluster=$(yq '.k8s.name' "${local_config}")
output=$(yq '.outputPath' "${local_config}")
job_id=$(yq '.jobId' "${local_config}")

declare -A params
params[image_registry]=$(yq '.imageRegistry' "${local_config}")
remote_iam_config=$(yq '.jobOutput.iam' "${local_config}")
local_iam_config=/tmp/iam-config.yaml
aws s3 cp ${remote_iam_config} ${local_iam_config} --region=$output_bucket_region

params[irsa_role_arn]=$(yq '.dataplane_manager.roleArn' "${local_iam_config}")
params[default_dataplane_account]=$(yq '.jobOptions.dataplaneManager.defaultDataplaneAccount' "${local_config}")
params[pca_arn]=$(yq '.jobOptions.ng-service.pcaArn' "${local_config}")
params[tidb_image_registry]=$(yq ".jobOptions.dataplaneManager.tidbImageRegistry // \"${params[image_registry]}\"" "${local_config}")
params[enable_pca]=$(yq ".jobOptions.ng-service.enable_pca // false" "${local_config}")
params[metering_bucket]=$(yq ".metering.bucketName" "${local_iam_config}")
params[metering_writeonly_role_arn]=$(yq ".metering.writeOnlyRoleArn" "${local_iam_config}")
params[metering_readwrite_role_arn]=$(yq ".metering.readWriteRoleArn" "${local_iam_config}")
params[is_byoc]=$(yq '.jobOptions.isByoc // "false"' "${local_config}")

route_rds_config=$(yq '.jobOutput.create-rds-db' "${local_config}")
local_rds_config=/tmp/rds-config.yaml
aws s3 cp ${route_rds_config} ${local_rds_config} --region=$output_bucket_region
rds_args=$(yq -ojson ".cluster_service" "${local_rds_config}")

# Convert params to json string
json_string_args="{\"rds\": $rds_args}"
for key in "${!params[@]}"; do
    json_string_args=$(echo "$json_string_args" | jq --arg key "$key" --arg value "${params[$key]}" '. + {($key): $value}')
done

# Sync application secrets to new region
# The main secret is created in us-west-2, we need to replicate to the new region
# if [[ $region != "us-west-2" ]]; then
#   secret_keys=("cluster_proxy_auth0_secret_key" "o11y_auth0_secret" "config_manager_auth_key" "config_manager_clinic_activity_key")
#   for secret_key in ${secret_keys[@]}; do
#     secret="${params[$secret_key]}"
#     aws secretsmanager replicate-secret-to-regions --secret-id "${secret}" --add-replica-regions Region=${region} --region=us-west-2
#   done
# fi

# Deploy application services by invoking deploy-new-region action in $argocd_repo
common_params="-f cloud=${cloud} -f region=${region} -f env=${env} -f cluster=${cluster} -f jobId=${job_id} -f logicalRegionName=${logicalRegionName}"
export GH_REPO="${argocd_repo}"
gh workflow run deploy-new-region-cluster-ng-service-crds.yaml ${common_params}
gh workflow run deploy-new-region-cluster-ng-server.yaml ${common_params} -f imageRegistry="${params[image_registry]}" -f args="${json_string_args}"


# Wait services ready
declare -A services
services["deploy/cluster-ng-server"]="false"
namespace=cluster-ng-service
wait_for_services_ready services namespace
