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

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

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

region=$(yq '.region' "${local_config}")
logical_region_name=$(yq '.name' "${local_config}")
env=$(yq '.env' "${local_config}")
aks_oidc_issuer=$(yq '.k8s.oidcIssuer' "${local_config}")
dataplane_subscriptions=$(yq -ojson '.azure.dataplaneSubscriptions' "${local_config}" | jq -r '.[]')
job_id=$(yq '.jobId' "${local_config}")
remote_output=$(yq '.outputPath' "${local_config}")
local_output=/tmp/output.yaml

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

cluster_controller_principal_id=$(yq '.clusterController.principalId' "${local_iam_config}")
region_server_principal_id=$(yq '.regionServer.principalId' "${local_iam_config}")
crossplane_principal_id=$(yq '.crossplaneAzureProvider.principalId' "${local_iam_config}")
ticdc_service_principal_id=$(yq '.ticdcService.principalId' "${local_iam_config}")

controlplane_tenant=$(yq '.azure.controlplaneTenantId' "${local_config}")
controlplane_subscription=$(yq '.azure.controlplaneSubscriptionId' "${local_config}")
client_id=$(yq '.azure.controlplaneClientId' "${local_config}")
tf_blob_endpoint=$(yq '.terraformStateBucket' "${local_config}")
tfstate_storage_account=$(get_blob_storage_account "${tf_blob_endpoint}")
tfstate_container=$(get_blob_container "${tf_blob_endpoint}")
tfstate_rg=$(az storage account show --name ${tfstate_storage_account} --query "resourceGroup" --output tsv)
access_key=$(az storage account keys list --account-name ${tfstate_storage_account} --resource-group ${tfstate_rg} --query "[0].value" --output tsv)
tf_common_backend_config="-backend-config=resource_group_name=${tfstate_rg} -backend-config=storage_account_name=${tfstate_storage_account} -backend-config=container_name=${tfstate_container}"

export ARM_USE_OIDC=true
export ARM_CLIENT_ID="${client_id}"
export ARM_TENANT_ID="${controlplane_tenant}"
export ARM_ACCESS_KEY="${access_key}"

tf_directory="${ROOT}/../terraform"
module_path="crossplane-azure-provider/dataplane"
cd "${tf_directory}/${module_path}"
for sub in ${dataplane_subscriptions[@]}; do
  tfstate="${module_path}/${sub}-${logical_region_name}-tfstate.json"
  export ARM_SUBSCRIPTION_ID="${sub}"
  terraform init -reconfigure ${tf_common_backend_config} -backend-config="key=${tfstate}"
  terraform destroy -auto-approve -var="principal_id=${crossplane_principal_id}"
done

module_path="crossplane-azure-provider/controlplane"
cd "${tf_directory}/${module_path}"
tfstate="${module_path}/${controlplane_subscription}-${logical_region_name}-tfstate.json"
export ARM_SUBSCRIPTION_ID="${controlplane_subscription}"
terraform init -reconfigure ${tf_common_backend_config} -backend-config="key=${tfstate}"
terraform destroy -auto-approve -var="env=${env}" \
  -var="location=${region}" \
  -var="aks_oidc_issuer=${aks_oidc_issuer}" \
  -var="logical_region_name=${logical_region_name}"

module_path="external-secrets-operator/controlplane"
cd "${tf_directory}/${module_path}"
tfstate="${module_path}/${controlplane_subscription}-${logical_region_name}-tfstate.json"
export ARM_SUBSCRIPTION_ID="${controlplane_subscription}"
terraform init -reconfigure ${tf_common_backend_config} -backend-config="key=${tfstate}"
terraform destroy -auto-approve -var="env=${env}" \
  -var="location=${region}" \
  -var="aks_oidc_issuer=${aks_oidc_issuer}" \
  -var="logical_region_name=${logical_region_name}"

module_path="cert-manager/controlplane"
cd "${tf_directory}/${module_path}"
tfstate="${module_path}/${controlplane_subscription}-${logical_region_name}-tfstate.json"
export ARM_SUBSCRIPTION_ID="${controlplane_subscription}"
terraform init -reconfigure ${tf_common_backend_config} -backend-config="key=${tfstate}"
terraform destroy -auto-approve -var="env=${env}" \
  -var="location=${region}" \
  -var="aks_oidc_issuer=${aks_oidc_issuer}" \
  -var="logical_region_name=${logical_region_name}"

module_path="regional-server/dataplane"
cd "${tf_directory}/${module_path}"
for sub in ${dataplane_subscriptions[@]}; do
  tfstate="${module_path}/${sub}-${logical_region_name}-tfstate.json"
  export ARM_SUBSCRIPTION_ID="${sub}"
  terraform init -reconfigure ${tf_common_backend_config} -backend-config="key=${tfstate}"
  terraform destroy -auto-approve -var="principal_id=${region_server_principal_id}"
done

module_path="regional-server/controlplane"
cd "${tf_directory}/${module_path}"
tfstate="${module_path}/${controlplane_subscription}-${logical_region_name}-tfstate.json"
export ARM_SUBSCRIPTION_ID="${controlplane_subscription}"
terraform init -reconfigure ${tf_common_backend_config} -backend-config="key=${tfstate}"
terraform destroy -auto-approve -var="env=${env}" \
  -var="location=${region}" \
  -var="aks_oidc_issuer=${aks_oidc_issuer}" \
  -var="logical_region_name=${logical_region_name}"

module_path="tcidm/controlplane"
cd "${tf_directory}/${module_path}"
tfstate="${module_path}/${controlplane_subscription}-${logical_region_name}-tfstate.json"
export ARM_SUBSCRIPTION_ID="${controlplane_subscription}"
terraform init -reconfigure ${tf_common_backend_config} -backend-config="key=${tfstate}"
terraform destroy -auto-approve -var="env=${env}" \
  -var="location=${region}" \
  -var="aks_oidc_issuer=${aks_oidc_issuer}" \
  -var="logical_region_name=${logical_region_name}"

module_path="cluster-controller/dataplane"
cd "${tf_directory}/${module_path}"
for sub in ${dataplane_subscriptions[@]}; do
  tfstate="${module_path}/${sub}-${logical_region_name}-tfstate.json"
  export ARM_SUBSCRIPTION_ID="${sub}"
  terraform init -reconfigure ${tf_common_backend_config} -backend-config="key=${tfstate}"
  terraform destroy -auto-approve -var="principal_id=${cluster_controller_principal_id}"
done

module_path="cluster-controller/controlplane"
cd "${tf_directory}/${module_path}"
tfstate="${module_path}/${controlplane_subscription}-${logical_region_name}-tfstate.json"
export ARM_SUBSCRIPTION_ID="${controlplane_subscription}"
terraform init -reconfigure ${tf_common_backend_config} -backend-config="key=${tfstate}"
terraform destroy -auto-approve -var="env=${env}" \
  -var="location=${region}" \
  -var="aks_oidc_issuer=${aks_oidc_issuer}" \
  -var="logical_region_name=${logical_region_name}"

module_path="ticdc-service/dataplane"
cd "${tf_directory}/${module_path}"
for sub in ${dataplane_subscriptions[@]}; do
  tfstate="${module_path}/${sub}-${logical_region_name}-tfstate.json"
  export ARM_SUBSCRIPTION_ID="${sub}"
  terraform init -reconfigure ${tf_common_backend_config} -backend-config="key=${tfstate}"
  terraform apply -auto-approve -var="principal_id=${ticdc_service_principal_id}"
done

module_path="ticdc-service/controlplane"
cd "${tf_directory}/${module_path}"
tfstate="${module_path}/${controlplane_subscription}-${logical_region_name}-tfstate.json"
export ARM_SUBSCRIPTION_ID="${controlplane_subscription}"
terraform init -reconfigure ${tf_common_backend_config} -backend-config="key=${tfstate}"
terraform apply -auto-approve -var="env=${env}" \
  -var="location=${region}" \
  -var="aks_oidc_issuer=${aks_oidc_issuer}" \
  -var="logical_region_name=${logical_region_name}"

module_path="vector-agent/controlplane"
cd "${tf_directory}/${module_path}"
tfstate="${module_path}/${controlplane_subscription}-${logical_region_name}-tfstate.json"
export ARM_SUBSCRIPTION_ID="${controlplane_subscription}"
terraform init -reconfigure ${tf_common_backend_config} -backend-config="key=${tfstate}"
terraform destroy -auto-approve -var="env=${env}" \
  -var="location=${region}" \
  -var="aks_oidc_issuer=${aks_oidc_issuer}" \
  -var="logical_region_name=${logical_region_name}"
