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

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

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

remote_iam_config=$(yq '.jobOutput.iam' "${local_config}")
local_iam_config=/tmp/iam-config.yaml
download_blob "${remote_iam_config}" "${local_iam_config}"

remote_regional_resource=$(yq '.jobOutput.regional-resource' "${local_config}")
local_regional_resource=/tmp/regional-resource.yaml
download_blob "${remote_regional_resource}" "${local_regional_resource}"

remote_aws_iam=$(yq '.jobOutput.aws-iam' "${local_config}")
local_aws_iam_config=/tmp/aws-iam-config.yaml
download_blob "${remote_aws_iam}" "${local_aws_iam_config}"

argocd_repo=tidbcloud/app-delivery
region=$(yq '.region' "${local_config}")
logical_region_name=$(yq '.name' "${local_config}")
env=$(yq '.env' "${local_config}")
cloud=$(yq '.cloudProvider' "${local_config}")
cluster=$(yq '.k8s.name' "${local_config}")
job_id=$(yq '.jobId' "${local_config}")
output=$(yq '.outputPath' "${local_config}")
image_registry=$(yq '.imageRegistry' "${local_config}")
regional_controlplane_ips=$(yq -ojson '.k8s.publicIps | map(. + "/32")' "$local_config")

availability_zones=$(yq -ojson '.jobOptions.regionalServer.availabilityZones | split(",")' "${local_config}")
dataplane_accounts=$(yq -ojson '.azure.dataplaneSubscriptions' "${local_config}")
auth0_audience=$(yq '.jobOptions.regionalServer.auth0Audience' "${local_config}")
auth0_domain=$(yq '.jobOptions.regionalServer.auth0Domain' "${local_config}")
global_controlplane_ips=$(yq -ojson '.jobOptions.regionalServer.globalControlplaneIPs' "${local_config}")
o11y_regional_service_ips=$(yq -ojson '.jobOptions.regionalServer.o11yRegionalServiceIPs' "${local_config}")
clinic_ips=$(yq -ojson '.jobOptions.regionalServer.clinicIPs' "${local_config}")
bastion_ips=$(yq -ojson '.jobOptions.regionalServer.bastionIPs' "${local_config}")
o11y_regional_service_endpoint=$(yq '.jobOptions.regionalServer.o11yRegionalServiceEndpoint' "${local_config}")

public_hosted_zone_domain=$(yq '.dataplaneDnsZone.name' "${local_regional_resource}")
public_hosted_zone_resource_group=$(yq '.dataplaneDnsZone.resourceGroup' "${local_regional_resource}")
cmek_app_id=$(yq '.cmek.appId' "${local_regional_resource}")
cmek_app_name=$(yq '.cmek.appName' "${local_regional_resource}")
cmek_uami_resource_id=$(yq '.cmek.uamiResourceId' "${local_regional_resource}")

pca_arn=$(yq '.jobOptions.clusterServer.fullManage.pcaArn' "${local_config}")

aws_irsa_role_arn=$(yq '.regionServer.roleArn' "${local_aws_iam_config}")
aws_assume_role_global_arn=$(yq '.regionServer.globalRoleArn' "${local_aws_iam_config}")

o11y_enabled=$(yq '.jobOptions.o11y.enabled' "${local_config}")
o11y_cluster_id=""
if [ "${o11y_enabled}" == "true" ]; then
  remote_o11y_agent_output=$(yq '.jobOutput.o11y-agent' "${local_config}")
  local_o11y_agent_output=/tmp/o11y-agent-output.yaml
  download_blob "${remote_o11y_agent_output}" "${local_o11y_agent_output}"
  o11y_cluster_id=$(yq '.o11y_cluster_id' "${local_o11y_agent_output}")
fi

cluster_controller_role=$(yq ".clusterController.roleArn" "${local_iam_config}")
cluster_dataplane_roles=$(yq -ojson ".clusterController.dataplaneRoleArns" "${local_iam_config}")

controlplane_subscription_id=$(yq '.azure.controlplaneSubscriptionId' "${local_config}")
regional_server_client_id=$(yq '.regionServer.clientId' "${local_iam_config}")
default_dataplane_account=$(yq '.jobOptions.regionalServer.defaultDataplaneSubscription' "${local_config}")
azure_tenant_id=$(yq '.azure.controlplaneTenantId' "${local_config}")
crossplane_client_id=$(yq '.crossplaneAzureProvider.clientId' "${local_iam_config}")
azure_admin_group_object_ids=$(yq -ojson '.jobOptions.regionalServer.azureAdminGroupObjectIds' "${local_config}")

additional_args=$(cat <<EOF
{
  "awsIrsaRoleArn": "$aws_irsa_role_arn",
  "awsAssumeRoleGlobalArn": "$aws_assume_role_global_arn",
  "availabilityZones": $availability_zones,
  "imageRegistry": "$image_registry",
  "dataplaneAccounts": $dataplane_accounts,
  "auth0Audience": "$auth0_audience",
  "auth0Domain": "$auth0_domain",
  "globalControlplaneIPs": $global_controlplane_ips,
  "regionalControlplaneIPs": $regional_controlplane_ips,
  "o11yRegionalServiceIPs": $o11y_regional_service_ips,
  "clinicIPs": $clinic_ips,
  "bastionIPs": $bastion_ips,
  "publicHostedZoneDomain": "$public_hosted_zone_domain",
  "o11yRegionalServiceEndpoint": "$o11y_regional_service_endpoint",
  "o11ySeedClusterId": "$o11y_cluster_id",
  "pcaArn": "$pca_arn",
  "controlplaneSubscriptionID": "$controlplane_subscription_id",
  "azureDrsClientID": "$regional_server_client_id",
  "defaultDataplaneAccount": "$default_dataplane_account",
  "azureTenantID": "$azure_tenant_id",
  "crossplaneAzureClientID": "$crossplane_client_id",
  "publicHostedZoneResourceGroup": "$public_hosted_zone_resource_group",
  "azureAdminGroupObjectIDs": $azure_admin_group_object_ids,
  "app_registration_id": "$cmek_app_id",
  "app_registration_name": "$cmek_app_name",
  "app_registration_umi": "$cmek_uami_resource_id"
}
EOF
)
echo "additionalArgs: $additional_args"

# 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=${logical_region_name}"
export GH_REPO="${argocd_repo}"
gh workflow run deploy-new-region-regional-server-crds.yaml ${common_params}
gh workflow run deploy-new-region-regional-server.yaml ${common_params} -f additionalArgs="${additional_args}"

# Wait services ready
declare -A services
services["deploy/regional-server"]="false"
namespace="regional-server-system"
wait_for_services_ready services namespace
