locals {
  e2e_mysql_dependencies = local.privatelink_enabled ? [{
    networkType            = "NetworkType_Private_Link"
    cloudProvider          = "azure"
    region                 = var.azure_location
    privateLinkServiceName = azurerm_private_link_service.services[0].alias
    ports                  = [local.ports.mysql]
    user                   = var.mysql_user
    password               = local.mysql_password
  }] : []

  e2e_kafka_dependencies = local.privatelink_enabled ? [
    {
      networkType            = "NetworkType_Private_Link"
      authType               = "DISABLE"
      tlsEnabled             = false
      cloudProvider          = "azure"
      region                 = var.azure_location
      projectID              = var.e2e_project_ids
      kafkaID                = local.deployment_name
      isCustomDomain         = true
      rootDomainName         = var.kafka_privatelink_root_domain_name
      dnsRecords             = { (var.kafka_privatelink_availability_zone) = local.kafka_privatelink_zone_record }
      privateLinkServiceName = azurerm_private_link_service.services[0].alias
      ports                  = [local.ports.kafka_pl_public]
      user                   = ""
      password               = ""
    },
    {
      networkType            = "NetworkType_Private_Link"
      authType               = "SASL_PLAIN"
      tlsEnabled             = false
      cloudProvider          = "azure"
      region                 = var.azure_location
      projectID              = var.e2e_project_ids
      kafkaID                = "${local.deployment_name}-sasl"
      isCustomDomain         = true
      rootDomainName         = var.kafka_privatelink_root_domain_name
      dnsRecords             = { (var.kafka_privatelink_availability_zone) = local.kafka_privatelink_zone_record }
      privateLinkServiceName = azurerm_private_link_service.services[0].alias
      ports                  = [local.ports.kafka_pl_sasl]
      user                   = local.kafka_sasl_username
      password               = local.kafka_sasl_password
    },
  ] : []
}

output "deployment_name" {
  value = local.deployment_name
}

output "azure_subscription_id" {
  value = var.azure_subscription_id
}

output "audit_tags" {
  value = local.tags
}

output "instance" {
  value = {
    id            = azurerm_linux_virtual_machine.services.id
    name          = azurerm_linux_virtual_machine.services.name
    desired_state = var.desired_state
  }
}

output "public_endpoints" {
  value = {
    public_ip      = azurerm_public_ip.services.ip_address
    service_access = "private-link-only"
  }
}

output "privatelink" {
  value = {
    enabled = local.privatelink_enabled
    mysql = local.privatelink_enabled ? {
      alias       = azurerm_private_link_service.services[0].alias
      resource_id = azurerm_private_link_service.services[0].id
      port        = local.ports.mysql
    } : null
    kafka = local.privatelink_enabled ? {
      alias            = azurerm_private_link_service.services[0].alias
      resource_id      = azurerm_private_link_service.services[0].id
      anonymous_port   = local.ports.kafka_pl_public
      sasl_plain_port  = local.ports.kafka_pl_sasl
      advertised_host  = local.kafka_privatelink_advertised_host
      root_domain_name = var.kafka_privatelink_root_domain_name
    } : null
  }
}

output "object_storage" {
  value = {
    account_name      = local.storage_account_name
    cdc_container_uri = local.blob_cdc_uri
    backup_export_uri = local.blob_backup_export_uri
    import_uri        = local.blob_import_uri
    sas_expiry        = var.blob_sas_expiry
    lifecycle_days    = 1
    auth_mode         = "account-sas"
  }
}

output "service_credentials" {
  sensitive = true
  value = {
    mysql = { root_password = local.mysql_root_password, user = var.mysql_user, password = local.mysql_password }
    kafka = { username = local.kafka_sasl_username, password = local.kafka_sasl_password }
    pulsar = {
      token_secret = local.pulsar_token_secret
      proxy_token  = data.external.pulsar_proxy_token.result.token
      admin_token  = data.external.pulsar_admin_token.result.token
      client_token = data.external.pulsar_client_token.result.token
    }
    azure_blob = {
      sas_token = data.azurerm_storage_account_sas.test_data.sas
      expiry    = var.blob_sas_expiry
    }
  }
}

output "e2e_dependency_yaml" {
  sensitive = true
  value = yamlencode({
    kafka = local.e2e_kafka_dependencies
    mysql = local.e2e_mysql_dependencies
    azureBlobStorage = [{
      containerURI = local.blob_cdc_uri
      region       = var.azure_location
      sasToken     = data.azurerm_storage_account_sas.test_data.sas
    }]
    importSampleData = {
      azureBlob = local.e2e_import_sample_data_azure
    }
  })
}
