module "cloud-addon" {
  source     = "../../modules/app"
  depends_on = [module.o11y-infra-cd, module.register-region-meta]

  workflow = "new-region-cloud-addon.yaml"
  gh_repo  = "tidbcloud/observability"
  gh_ref   = "main"
  parameters = {
    vendor            = "alicloud"
    region            = var.cloud_region
    logicalRegionName = var.logical_region_name
    env               = var.env
    cluster           = local.cluster_name
    args = jsonencode({
      # Comma-separated list of vswitch IDs for the node subnets
      vswitchIDs = join(",", alicloud_vswitch.node[*].id)
      # Comma-separated list of zone-to-vswitch mappings in format zone:vswitch_id
      zoneMaps       = join(",", [for i in range(length(var.zone_ids)) : "${var.zone_ids[i]}:${alicloud_vswitch.node[i].id}"])
      imageRegistry  = local.image_registry
      hostedZoneName = var.env == "prod" ? "observability.tidbcloud.com" : "observability-${var.env}.pingcap.cloud"
    })
  }
  wait_workflow_success = true
  finalizer = {
    workflow = "destroy-region-cloud-addon.yaml"
    parameters = {
      vendor            = "alicloud"
      region            = var.cloud_region
      logicalRegionName = var.logical_region_name
      env               = var.env
    }
  }
}

resource "null_resource" "cloud-addon-svc-finalizer" {
  depends_on = [module.cloud-addon]

  lifecycle {
    ignore_changes = all
  }

  triggers = {
    kubeconfig_path = module.kubeconfig.path
  }

  provisioner "local-exec" {
    when        = destroy
    interpreter = ["bash", "-c"]
    environment = {
      KUBECONFIG = self.triggers.kubeconfig_path
    }
    command = <<-EOT
      set -xeou pipefail

      kubectl delete svc nginx-write -n kube-system --ignore-not-found
      kubectl delete svc ingress-nginx-write-controller -n kube-system --ignore-not-found
      kubectl delete ingress nginx-read -n kube-system --ignore-not-found
      kubectl delete ingress nginx-ingress -n kube-system --ignore-not-found

      kubectl wait --for=delete svc/nginx-write -n kube-system --timeout=600s
      kubectl wait --for=delete svc/ingress-nginx-write-controller -n kube-system --timeout=600s
      kubectl wait --for=delete ingress/nginx-read -n kube-system --timeout=600s
      kubectl wait --for=delete ingress/nginx-ingress -n kube-system --timeout=600s
    EOT
  }
}

module "cloud-addon-cd" {
  depends_on = [module.cloud-addon]
  source     = "../../modules/app"

  kubeconfig_path = module.kubeconfig.path
  workflow        = "cloud-addon-cd.yaml"
  gh_repo         = "tidbcloud/observability"
  gh_ref          = "main"
  parameters = {
    vendor  = "alicloud"
    region  = var.logical_region_name
    env     = var.env
    git-ref = "main"
  }
  services = [
    {
      name      = "deploy/ingress-nginx-read-controller"
      namespace = "kube-system"
      wait_for  = "jsonpath='{.status.availableReplicas}'=REPLICAS"
    },
    {
      name      = "deploy/ingress-nginx-write-controller"
      namespace = "kube-system"
      wait_for  = "jsonpath='{.status.availableReplicas}'=REPLICAS"
    }
  ]
  wait_workflow_success = true
  check_before_destroy  = false
}
