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               = local.region_outputs.key_vault_name
  dataplane_manager_object_id  = module.iam.dataplane_manager_principal_id
  controlplane_subscription_id = local.controlplane_subscription

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

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                 = local.image_registry
    azureWorkloadIdentityClientID = module.iam.dataplane_manager_client_id
    azureWorkloadIdentityTenantID = local.controlplane_tenant_id
    tidbImageRegistry             = local.tidb_image_registry
    isByoc                        = false
  }

  o11y_agent_additional_args = {
    clusterName                = local.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              = local.image_registry
    tenantId                   = "infra-${var.env}"
    projectId                  = "seed"
  }
}

resource "azurerm_private_endpoint" "o11y" {
  name                = "${local.cluster_name}-o11y-pe"
  location            = var.cloud_region
  resource_group_name = module.aks.resource_group_name
  subnet_id           = module.aks.subnet_id
  tags                = local.tags

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

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

output "o11y_cluster_id" {
  value = module.o11y_cluster.o11y_cluster_id
}

output "o11y_private_endpoint_id" {
  value = azurerm_private_endpoint.o11y.id
}

output "o11y_private_endpoint_ip" {
  value = local.o11y_private_endpoint_ip
}

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"
    }
  ]
}
