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

# When changing this script, remember to modify the corresponding github action
region=${1}
zones=${2}
env=${3}
logicalRegionName=${4}
cloud=${5}
json_file_path=${6}

additionalArgs=$(jq -r '.' "${json_file_path}")
echo "additionalArgs: ${additionalArgs}"

image_registry=$(echo "${additionalArgs}" | jq -r '.imageRegistry')
awsAssumeRoleName=$(echo "${additionalArgs}" | jq -r '.awsAssumeRoleName')
awsAssumeRoleExternalId=$(echo "${additionalArgs}" | jq -r '.awsAssumeRoleExternalId')
awsRoleArn=$(echo "${additionalArgs}" | jq -r '.awsRoleArn')
azureSubscriptionId=$(echo "${additionalArgs}" | jq -r '.azureSubscriptionId')
azureTenantId=$(echo "${additionalArgs}" | jq -r '.azureTenantId')
azureClientId=$(echo "${additionalArgs}" | jq -r '.azureClientId')
azureDataPlaneSubscriptionId=$(echo "${additionalArgs}" | jq -r '.azureDataPlaneSubscriptionId')
azureControlPlaneResourceGroup=$(echo "${additionalArgs}" | jq -r '.azureControlPlaneResourceGroup')
gcpServiceAccount=$(echo "${additionalArgs}" | jq -r '.gcpServiceAccount')
crossplaneAzureClientID=$(echo "${additionalArgs}" | jq -r '.crossplaneAzureClientID')

# Ensure jq is installed
if ! command -v jq &> /dev/null; then
    echo "jq could not be found. Please install jq to continue."
    exit 1
fi

# Validate cloud provider
case "${cloud}" in
    aws|azure|gcp)
        ;;
    *)
        echo "invalid cloud provider: ${cloud}"
        exit 1
        ;;
esac

ROOT=$(cd $(dirname ${BASH_SOURCE[0]}) && pwd)
deploy_dir="${ROOT}/envs/${cloud}-${env}-${logicalRegionName}"
template_dir="${ROOT}/variants/${env}_${cloud}_template"

if [ -e ${deploy_dir} ]; then
  echo "New region deploy directory already exist"
  exit 1
fi

mkdir -p "${deploy_dir}"
echo "Prepare manifest files"

# Copy template files
cp ${template_dir}/* "${deploy_dir}/"

# Set up sed command based on OS
if [[ "$OSTYPE" == "darwin"* ]]; then
    # Require gnu-sed on macOS
    if ! [ -x "$(command -v gsed)" ]; then
        echo "Error: 'gsed' is not installed." >&2
        echo "If you are using Homebrew, install with 'brew install gnu-sed'." >&2
        exit 1
    fi
    SED_CMD=gsed
else
    SED_CMD=sed
fi

# Replace region in config
${SED_CMD} -i "s|LOGICAL_REGION_PLACEHOLDER|${logicalRegionName}|g" "${deploy_dir}/root-config.yaml"
${SED_CMD} -i "s|REGION_PLACEHOLDER|${region}|g" "${deploy_dir}/root-config.yaml"
${SED_CMD} -i "s|AWS_ROLE_ARN_PLACEHOLDER|${awsRoleArn}|g" "${deploy_dir}/serviceaccount.yaml"
${SED_CMD} -i "s|CROSSPLANE_AZURE_PROVIDER_SUBSCRIPTION_ID_PLACEHOLDER|${azureSubscriptionId}|g" "${deploy_dir}/root-config.yaml"
${SED_CMD} -i "s|CROSSPLANE_AZURE_PROVIDER_TENANT_ID_PLACEHOLDER|${azureTenantId}|g" "${deploy_dir}/root-config.yaml"
${SED_CMD} -i "s|CROSSPLANE_AZURE_PROVIDER_CLIENT_ID_PLACEHOLDER|${crossplaneAzureClientID}|g" "${deploy_dir}/root-config.yaml"
${SED_CMD} -i "s|AZURE_PROVIDER_CLIENT_ID_PLACEHOLDER|${azureClientId}|g" "${deploy_dir}/serviceaccount.yaml"
${SED_CMD} -i "s|CROSSPLANE_AZURE_PROVIDER_DATA_PLANE_SUBSCRIPTION_ID_PLACEHOLDER|${azureDataPlaneSubscriptionId}|g" "${deploy_dir}/root-config.yaml"
${SED_CMD} -i "s|CONTROL_PLANE_RESOURCE_GROUP_PLACEHOLDER|${azureControlPlaneResourceGroup}|g" "${deploy_dir}/root-config.yaml"
${SED_CMD} -i "s|ASSUME_ROLE_NAME_PLACEHOLDER|${awsAssumeRoleName}|g" "${deploy_dir}/root-config.yaml"
${SED_CMD} -i "s|ASSUME_ROLE_EXTERNAL_ID_PLACEHOLDER|${awsAssumeRoleExternalId}|g" "${deploy_dir}/root-config.yaml"
${SED_CMD} -i "s|GOOGLE_SERVICE_ACCOUNT_PLACEHOLDER|${gcpServiceAccount}|g" "${deploy_dir}/serviceaccount.yaml"

# Update version.yaml with image registry and version
${SED_CMD} -i "s|IMAGE_REGISTRY_PLACEHOLDER|${image_registry}|g" "${deploy_dir}/version.yaml"

echo "Successfully deployed import controller to ${cloud}-${env}-${logicalRegionName}"
