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

action=${1:-apply}
remote_config=${CONFIG_PATH}
local_config=${LOCAL_CONFIG_PATH}
# az storage blob copy "${remote_config}" "${local_config}"
region=$(yq '.region' "${local_config}")
env=$(yq '.env' "${local_config}")
aks_oidc_issuer=$(yq '.k8s.oidcIssuer' "${local_config}")
controlplane_subscription=$(yq '.azure.controlplaneSubscription' "${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
ROOT=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
tf_directory="${ROOT}/modules"
tfstate_rg=$(yq '.terraformStateResourceGroup' "${local_config}")
tfstate_storage_account=$(yq '.terraformStateStorageAccount' "${local_config}")
tfstate_container=$(yq '.terraformStateContainer' "${local_config}")

set -x
module_path="crossplane-azure-provider/controlplane"
cd "${tf_directory}/${module_path}"
tfstate="${module_path}/${controlplane_subscription}-${region}-tfstate.json"
terraform init -backend-config="resource_group_name=${tfstate_rg}" -backend-config="storage_account_name=${tfstate_storage_account}" -backend-config="container_name=${tfstate_container}" -backend-config="key=${tfstate}"
terraform ${action} -auto-approve -var="env=${env}" -var="location=${region}" -var="subscription_id=${controlplane_subscription}" -var="aks_oidc_issuer=${aks_oidc_issuer}"
crossplane_principal_id=$(terraform output -json | jq -r '.principal_id.value')
crossplane_client_id=$(terraform output -json | jq -r '.client_id.value')

module_path="crossplane-azure-provider/dataplane"
cd "${tf_directory}/${module_path}"
for sub in ${dataplane_subscriptions[@]}; do
  tfstate="${module_path}/${sub}-${region}-tfstate.json"
  terraform init -reconfigure -backend-config="resource_group_name=${tfstate_rg}" -backend-config="storage_account_name=${tfstate_storage_account}" -backend-config="container_name=${tfstate_container}" -backend-config="key=${tfstate}"
  terraform ${action} -auto-approve -var="subscription_id=${sub}" -var="principal_id=${crossplane_principal_id}"
done

module_path="external-secrets-operator/controlplane"
cd "${tf_directory}/${module_path}"
tfstate="${module_path}/${controlplane_subscription}-${region}-tfstate.json"
terraform init -backend-config="resource_group_name=${tfstate_rg}" -backend-config="storage_account_name=${tfstate_storage_account}" -backend-config="container_name=${tfstate_container}" -backend-config="key=${tfstate}"
terraform ${action} -auto-approve -var="env=${env}" -var="location=${region}" -var="subscription_id=${controlplane_subscription}" -var="aks_oidc_issuer=${aks_oidc_issuer}"
external_secrets_operator_principal_id=$(terraform output -json | jq -r '.principal_id.value')
external_secrets_operator_client_id=$(terraform output -json | jq -r '.client_id.value')

module_path="cert-manager/controlplane"
cd "${tf_directory}/${module_path}"
tfstate="${module_path}/${controlplane_subscription}-${region}-tfstate.json"
terraform init -backend-config="resource_group_name=${tfstate_rg}" -backend-config="storage_account_name=${tfstate_storage_account}" -backend-config="container_name=${tfstate_container}" -backend-config="key=${tfstate}"
terraform ${action} -auto-approve -var="env=${env}" -var="location=${region}" -var="subscription_id=${controlplane_subscription}" -var="aks_oidc_issuer=${aks_oidc_issuer}"
cert_manager_principal_id=$(terraform output -json | jq -r '.principal_id.value')
cert_manager_client_id=$(terraform output -json | jq -r '.client_id.value')

module_path="regional-server/controlplane"
cd "${tf_directory}/${module_path}"
tfstate="${module_path}/${controlplane_subscription}-${region}-tfstate.json"
terraform init -backend-config="resource_group_name=${tfstate_rg}" -backend-config="storage_account_name=${tfstate_storage_account}" -backend-config="container_name=${tfstate_container}" -backend-config="key=${tfstate}"
terraform ${action} -auto-approve -var="env=${env}" -var="location=${region}" -var="subscription_id=${controlplane_subscription}" -var="aks_oidc_issuer=${aks_oidc_issuer}"
region_server_principal_id=$(terraform output -json | jq -r '.principal_id.value')
region_server_client_id=$(terraform output -json | jq -r '.client_id.value')

module_path="regional-server/dataplane"
cd "${tf_directory}/${module_path}"
for sub in ${dataplane_subscriptions[@]}; do
  tfstate="${module_path}/${sub}-${region}-tfstate.json"
  terraform init -reconfigure -backend-config="resource_group_name=${tfstate_rg}" -backend-config="storage_account_name=${tfstate_storage_account}" -backend-config="container_name=${tfstate_container}" -backend-config="key=${tfstate}"
  terraform ${action} -auto-approve -var="subscription_id=${sub}" -var="principal_id=${region_server_principal_id}"
done

module_path="cluster-controller/controlplane"
cd "${tf_directory}/${module_path}"
tfstate="${module_path}/${controlplane_subscription}-${region}-tfstate.json"
terraform init -backend-config="resource_group_name=${tfstate_rg}" -backend-config="storage_account_name=${tfstate_storage_account}" -backend-config="container_name=${tfstate_container}" -backend-config="key=${tfstate}"
terraform ${action} -auto-approve -var="env=${env}" -var="location=${region}" -var="subscription_id=${controlplane_subscription}" -var="aks_oidc_issuer=${aks_oidc_issuer}"
cluster_controller_principal_id=$(terraform output -json | jq -r '.principal_id.value')
cluster_controller_client_id=$(terraform output -json | jq -r '.client_id.value')

module_path="cluster-controller/dataplane"
cd "${tf_directory}/${module_path}"
for sub in ${dataplane_subscriptions[@]}; do
  tfstate="${module_path}/${sub}-${region}-tfstate.json"
  terraform init -reconfigure -backend-config="resource_group_name=${tfstate_rg}" -backend-config="storage_account_name=${tfstate_storage_account}" -backend-config="container_name=${tfstate_container}" -backend-config="key=${tfstate}"
  terraform ${action} -auto-approve -var="subscription_id=${sub}" -var="principal_id=${cluster_controller_principal_id}"
done

module_path="ticdc-service/controlplane"
cd "${tf_directory}/${module_path}"
tfstate="${module_path}/${controlplane_subscription}-${region}-tfstate.json"
terraform init -backend-config="resource_group_name=${tfstate_rg}" -backend-config="storage_account_name=${tfstate_storage_account}" -backend-config="container_name=${tfstate_container}" -backend-config="key=${tfstate}"
terraform ${action} -auto-approve -var="env=${env}" -var="location=${region}" -var="subscription_id=${controlplane_subscription}" -var="aks_oidc_issuer=${aks_oidc_issuer}"
ticdc_service_principal_id=$(terraform output -json | jq -r '.principal_id.value')
ticdc_service_client_id=$(terraform output -json | jq -r '.client_id.value')

module_path="ticdc-service/dataplane"
cd "${tf_directory}/${module_path}"
for sub in ${dataplane_subscriptions[@]}; do
  tfstate="${module_path}/${sub}-${region}-tfstate.json"
  terraform init -reconfigure -backend-config="resource_group_name=${tfstate_rg}" -backend-config="storage_account_name=${tfstate_storage_account}" -backend-config="container_name=${tfstate_container}" -backend-config="key=${tfstate}"
  terraform ${action} -auto-approve -var="subscription_id=${sub}" -var="principal_id=${ticdc_service_principal_id}"
done

module_path="vector-agent/controlplane"
cd "${tf_directory}/${module_path}"
tfstate="${module_path}/${controlplane_subscription}-${region}-tfstate.json"
terraform init -backend-config="resource_group_name=${tfstate_rg}" -backend-config="storage_account_name=${tfstate_storage_account}" -backend-config="container_name=${tfstate_container}" -backend-config="key=${tfstate}"
terraform ${action} -auto-approve -var="env=${env}" -var="location=${region}" -var="subscription_id=${controlplane_subscription}" -var="aks_oidc_issuer=${aks_oidc_issuer}"
vector_agent_principal_id=$(terraform output -json | jq -r '.principal_id.value')
vector_agent_client_id=$(terraform output -json | jq -r '.client_id.value')

o11y_region_server_principal_id=$(yq '.o11y.regionalServerPrincipalId' "${local_config}")
module_path="o11y-regional-server/controlplane"
cd "${tf_directory}/${module_path}"
tfstate="${module_path}/${controlplane_subscription}-${region}-tfstate.json"
terraform init -backend-config="resource_group_name=${tfstate_rg}" -backend-config="storage_account_name=${tfstate_storage_account}" -backend-config="container_name=${tfstate_container}" -backend-config="key=${tfstate}"
terraform ${action} -auto-approve -var="env=${env}" -var="location=${region}" -var="subscription_id=${controlplane_subscription}" -var="aks_oidc_issuer=${aks_oidc_issuer}" -var="principal_id=${o11y_region_server_principal_id}"

module_path="o11y-regional-server/dataplane"
cd "${tf_directory}/${module_path}"
for sub in ${dataplane_subscriptions[@]}; do
  tfstate="${module_path}/${sub}-${region}-tfstate.json"
  terraform init -reconfigure -backend-config="resource_group_name=${tfstate_rg}" -backend-config="storage_account_name=${tfstate_storage_account}" -backend-config="container_name=${tfstate_container}" -backend-config="key=${tfstate}"
  terraform ${action} -auto-approve -var="subscription_id=${sub}" -var="principal_id=${o11y_region_server_principal_id}"
done


cat <<EOF > "${local_output}"
clusterController:
  clientId: ${cluster_controller_client_id}
ticdcService:
  clientId: ${ticdc_service_client_id}
regionServer:
  clientId: ${region_server_client_id}
crossplaneAzureProvider:
  clientId: ${crossplane_client_id}
externalSecretsOperator:
  clientId: ${external_secrets_operator_client_id}
certManager:
  clientId: ${cert_manager_client_id}
vectorAgent:
  clientId: ${vector_agent_client_id}
EOF

# echo "Write output to Blob Storage..."
# aws s3 cp "${local_output}" "${remote_output}"
