#!/usr/bin/env bash
set -euo pipefail
# When changing this script, remember to modify the corresponding github action
region=${1}
env=${2}
cloud=${3}
image_registry=${4}
logicalRegionName=${5}
json_file_path=${6}
service_plan=${7:-}

ROOT=$(cd $(dirname ${BASH_SOURCE[0]}) && pwd)
variant_dir="${ROOT}/variants/${env}-${cloud}"

case "${service_plan}" in
  "")
    config_template="${variant_dir}/config_tmpl.yaml"
    ;;
  Premium)
    config_template="${variant_dir}/config-premium_tmpl.yaml"
    ;;
  EssentialV2)
    config_template="${variant_dir}/config-essential-v2_tmpl.yaml"
    ;;
  *)
    echo "Unsupported service plan: ${service_plan}" >&2
    exit 1
    ;;
esac

if [ ! -s "${config_template}" ]; then
  echo "Config template does not exist or is empty: ${config_template}" >&2
  exit 1
fi

if ! cmp -s "${variant_dir}/config_tmpl.yaml" "${variant_dir}/config-premium_tmpl.yaml"; then
  echo "Legacy and Premium config templates must stay identical in ${variant_dir}" >&2
  exit 1
fi

case "${cloud}" in
  azure)
    deploy_env_name="azure-${env}-${logicalRegionName}"
    ;;
  alicloud)
    deploy_env_name="ali-${env}-${logicalRegionName}"
    ;;
  *)
    deploy_env_name="${env}-${logicalRegionName}"
    ;;
esac

deploy_dir="${ROOT}/envs/${deploy_env_name}"

irsa_role_arn=$(jq -r '.irsa_role_arn // ""' "${json_file_path}")
irsa_role_name=$(jq -r '.irsa_role_name // ""' "${json_file_path}")
enable_pca=$(jq -r '.enable_pca // false' "${json_file_path}")
default_dataplane_account=$(jq -r '.default_dataplane_account // ""' "${json_file_path}")
tidb_image_registry=$(jq -r ".tidb_image_registry // \"${image_registry}\"" "${json_file_path}")
rds_host=$(jq -r '.rds.host // ""' "${json_file_path}")
rds_port=$(jq -r '.rds.port // ""' "${json_file_path}")
rds_db=$(jq -r '.rds.db // ""' "${json_file_path}")
rds_username=$(jq -r '.rds.username // ""' "${json_file_path}")
rds_password_secret_name=$(jq -r '.rds.password_secret_name // ""' "${json_file_path}")
metering_bucket=$(jq -r '.metering_bucket // ""' "${json_file_path}")
metering_readwrite_role_arn=$(jq -r '.metering_readwrite_role_arn // ""' "${json_file_path}")
metering_writeonly_role_arn=$(jq -r '.metering_writeonly_role_arn // ""' "${json_file_path}")
metering_plan=$(jq -r '.metering_plan // "premium"' "${json_file_path}")
enable_metering_worker_node=$(jq -r '.enable_metering_worker_node // false' "${json_file_path}")
is_byoc=$(jq -r '.is_byoc // "false"' "${json_file_path}")
o11y_cluster_cidr=$(jq -r '.o11y_cluster_cidr // ""' "${json_file_path}")
metering_enabled=$(if [ "$is_byoc" = "true" ]; then echo "false"; else echo "true"; fi)
disable_o11y=$(jq -r '.disable_o11y // false' "${json_file_path}")
azure_workload_identity_client_id=$(jq -r '.azure_workload_identity_client_id // ""' "${json_file_path}")
azure_workload_identity_tenant_id=$(jq -r '.azure_workload_identity_tenant_id // ""' "${json_file_path}")
azure_storage_account=$(jq -r '.azure_storage_account // ""' "${json_file_path}")

if [ "$is_byoc" = "true" ]; then
  if [ -z "$o11y_cluster_cidr" ]; then
    echo "Error: o11y_cluster_cidr is required when is_byoc is true" >&2
    exit 1
  fi
  if ! command -v yq >/dev/null 2>&1; then
    echo "Error: yq is required to configure BYOC resource pool options" >&2
    exit 1
  fi
fi

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

echo "Prepare manifest files"
cp "${variant_dir}/kustomization_tmpl.yaml" "${deploy_dir}/kustomization.yaml"
cp "${config_template}" "${deploy_dir}/config.yaml"
cp "${variant_dir}/serviceaccount_tmpl.yaml" "${deploy_dir}/serviceaccount.yaml"
cp "${variant_dir}/externalsecret_tmpl.yaml" "${deploy_dir}/externalsecret.yaml"
mkdir -p "${deploy_dir}/executor"
cp "${variant_dir}/executor/version.yaml" "${deploy_dir}/executor/version.yaml"
mkdir -p "${deploy_dir}/autoscaler-engine"
cp "${variant_dir}/autoscaler-engine/version.yaml" "${deploy_dir}/autoscaler-engine/version.yaml"

# https://stackoverflow.com/questions/4247068/sed-command-with-i-option-failing-on-mac-but-works-on-linux
if [[ "$OSTYPE" == "darwin"* ]]; then
  # Require gnu-sed.
  if ! [ -x "$(command -v gsed)" ]; then
    echo "Error: 'gsed' is not istalled." >&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

${SED_CMD} -i "s|REGION|${region}|g" "${deploy_dir}/config.yaml"
${SED_CMD} -i "s|CLOUD|${cloud}|g" "${deploy_dir}/config.yaml"
${SED_CMD} -i "s|ENV|${env}|g" "${deploy_dir}/config.yaml"
${SED_CMD} -i "s|TMPL_TIDB_IMAGE_REGISTRY|${tidb_image_registry}|g" "${deploy_dir}/config.yaml"
${SED_CMD} -i "s|ENABLE_PCA|${enable_pca}|g" "${deploy_dir}/config.yaml"
${SED_CMD} -i "s|DEFAULT_DATAPLANE_ACCOUNT|${default_dataplane_account}|g" "${deploy_dir}/config.yaml"
${SED_CMD} -i "s|RDS_HOST|${rds_host}|g" "${deploy_dir}/config.yaml"
${SED_CMD} -i "s|RDS_PORT|${rds_port}|g" "${deploy_dir}/config.yaml"
${SED_CMD} -i "s|RDS_DB_NAME|${rds_db}|g" "${deploy_dir}/config.yaml"
${SED_CMD} -i "s|RDS_USERNAME|${rds_username}|g" "${deploy_dir}/config.yaml"
${SED_CMD} -i "s|METERING_BUCKET|${metering_bucket}|g" "${deploy_dir}/config.yaml"
${SED_CMD} -i "s|METERING_PLAN|${metering_plan}|g" "${deploy_dir}/config.yaml"
${SED_CMD} -i "s|ENABLE_METERING_WORKER_NODE|${enable_metering_worker_node}|g" "${deploy_dir}/config.yaml"
${SED_CMD} -i "s|ENABLE_METERING|${metering_enabled}|g" "${deploy_dir}/config.yaml"
${SED_CMD} -i "s|METERING_READWRITE_ROLE_ARN|${metering_readwrite_role_arn}|g" "${deploy_dir}/config.yaml"
${SED_CMD} -i "s|METERING_WRITEONLY_ROLE_ARN|${metering_writeonly_role_arn}|g" "${deploy_dir}/config.yaml"
${SED_CMD} -i "s|DISABLE_O11Y|${disable_o11y}|g" "${deploy_dir}/config.yaml"

# Append audit-kong to kongDataplanePlugins if BYOC
if [ "$is_byoc" = "true" ]; then
  ${SED_CMD} -i "s|kongDataplanePlugins: \(.*\)|kongDataplanePlugins: \1,audit-kong|g" "${deploy_dir}/config.yaml"
  O11Y_CLUSTER_CIDR="$o11y_cluster_cidr" yq eval -i '
    .server.biz.o11yClusterCidr = strenv(O11Y_CLUSTER_CIDR) |
    .server.biz.storageSizePolicy = {
      "tikv": {
        "data": {
          "defaultSizeGi": 500,
          "minSizeGi": 100,
          "maxSizeGi": 4000
        },
        "raftlog": {
          "defaultSizeGi": 40,
          "minSizeGi": 20,
          "maxSizeGi": 500
        }
      },
      "tiflashCompute": {
        "data": {
          "defaultSizeGi": 500,
          "minSizeGi": 100,
          "maxSizeGi": 4000
        }
      }
    }
  ' "${deploy_dir}/config.yaml"
fi

${SED_CMD} -i "s|TMPL_IMAGE_REGISTRY|${image_registry}|g" "${deploy_dir}/kustomization.yaml"
${SED_CMD} -i "s|IRSA_ROLE_ARN|${irsa_role_arn}|g" "${deploy_dir}/serviceaccount.yaml"
${SED_CMD} -i "s|IRSA_ROLE_NAME|${irsa_role_name}|g" "${deploy_dir}/serviceaccount.yaml"
${SED_CMD} -i "s|CLIENT_ID|${azure_workload_identity_client_id}|g" "${deploy_dir}/serviceaccount.yaml"
${SED_CMD} -i "s|TENANT_ID|${azure_workload_identity_tenant_id}|g" "${deploy_dir}/serviceaccount.yaml"
${SED_CMD} -i "s|RDS_PASSWORD_SECRET_NAME|${rds_password_secret_name}|g" "${deploy_dir}/externalsecret.yaml"
${SED_CMD} -i "s|TMPL_IMAGE_REGISTRY|${image_registry}|g" "${deploy_dir}/executor/version.yaml"
${SED_CMD} -i "s|TMPL_IMAGE_REGISTRY|${image_registry}|g" "${deploy_dir}/autoscaler-engine/version.yaml"
${SED_CMD} -i "s|AZURE_STORAGE_ACCOUNT|${azure_storage_account}|g" "${deploy_dir}/config.yaml"
