module "o11y_cluster" {
  source = "../../../modules/o11y_cluster"

  env                          = var.env
  logical_region_name          = var.logical_region_name
  cloud_provider               = "azure"
  cloud_region                 = var.cloud_region
  key_vault_name               = var.region_key_vault_name
  dataplane_manager_object_id  = module.iam.dataplane_manager_principal_id
  controlplane_subscription_id = var.pingcap_subscription_id

  providers = {
    aws.kv_bucket = aws.kv_bucket
  }
}

locals {
  o11y_endpoint_service_name = try(module.o11y_cluster.monitor_info.endpointServiceName, "")
  o11y_private_endpoint_ip   = try(azurerm_private_endpoint.o11y.private_service_connection[0].private_ip_address, "")

  o11y_agent_control_server_additional_args = {
    imageRegistry                 = var.image_registry
    azureWorkloadIdentityClientID = module.iam.dataplane_manager_client_id
    azureWorkloadIdentityTenantID = var.customer_tenant_id
    tidbImageRegistry             = var.customer_acr_login_server
    isByoc                        = true
  }

  o11y_agent_additional_args = {
    clusterName                = var.cluster_name
    logBucketName              = module.o11y_cluster.storage_info.logs.bucketName
    storageAccountName         = module.o11y_cluster.storage_info.logs.storageAccount
    o11yId                     = module.o11y_cluster.o11y_cluster_id
    o11yEndpointServiceDNSName = local.o11y_private_endpoint_ip
    imageRegistry              = var.image_registry
    tenantId                   = "infra-${var.env}"
    projectId                  = "seed"
  }
}

resource "azurerm_private_endpoint" "o11y" {
  name                = "${var.cluster_name}-o11y-pe"
  location            = var.cloud_region
  resource_group_name = azurerm_resource_group.rcp.name
  subnet_id           = azurerm_subnet.rcp_pe.id
  tags                = local.tags

  private_service_connection {
    name                           = "${var.cluster_name}-o11y-connection"
    private_connection_resource_id = local.o11y_endpoint_service_name
    is_manual_connection           = true
    request_message                = "auto-deploy ${var.cluster_name}"
  }

  lifecycle {
    precondition {
      condition     = local.o11y_endpoint_service_name != ""
      error_message = "o11y monitor_info.endpointServiceName is empty."
    }
  }
}

module "o11y_agent_control_server" {
  source = "../../../modules/app"

  kubeconfig_path = module.kubeconfig.path
  workflow        = "deploy-new-region-next-gen-o11y-agent-control-server.yaml"
  parameters = {
    cloud             = "azure"
    env               = var.env
    region            = var.cloud_region
    logicalRegionName = var.logical_region_name
    cluster           = module.argocd_cluster.name
    additionalArgs    = jsonencode(local.o11y_agent_control_server_additional_args)
  }
  services = [
    {
      name      = "deploy/o11y-agent-control-server"
      namespace = "observability"
      wait_for  = "jsonpath='{.status.availableReplicas}'=REPLICAS"
    }
  ]
}

module "o11y_agent" {
  depends_on = [module.o11y_agent_control_server, azurerm_private_endpoint.o11y]
  source     = "../../../modules/app"

  kubeconfig_path = module.kubeconfig.path
  workflow        = "deploy-new-region-next-gen-o11y-agent.yaml"
  parameters = {
    cloud             = "azure"
    env               = var.env
    region            = var.cloud_region
    logicalRegionName = var.logical_region_name
    cluster           = module.argocd_cluster.name
    additionalArgs    = jsonencode(local.o11y_agent_additional_args)
  }
  services = [
    {
      name      = "sts/vmagent-${var.env}-seed-${var.logical_region_name}-o11y"
      namespace = "monitoring"
      wait_for  = "jsonpath='{.status.availableReplicas}'=REPLICAS"
    }
  ]
}
