locals {
  e2e_mysql_dependencies = local.privatelink_enabled ? [{
    networkType            = "NetworkType_Private_Link"
    cloudProvider          = "gcp"
    region                 = var.gcp_region
    privateLinkServiceName = google_compute_service_attachment.services[0].id
    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          = "gcp"
      region                 = var.gcp_region
      projectID              = var.e2e_project_ids
      kafkaID                = local.deployment_name
      isCustomDomain         = true
      rootDomainName         = var.kafka_privatelink_root_domain_name
      dnsRecords             = { "all zones" = local.kafka_privatelink_zone_record }
      privateLinkServiceName = google_compute_service_attachment.services[0].id
      ports                  = [local.ports.kafka_pl_public]
      user                   = ""
      password               = ""
    },
    {
      networkType            = "NetworkType_Private_Link"
      authType               = "SASL_PLAIN"
      tlsEnabled             = false
      cloudProvider          = "gcp"
      region                 = var.gcp_region
      projectID              = var.e2e_project_ids
      kafkaID                = "${local.deployment_name}-sasl"
      isCustomDomain         = true
      rootDomainName         = var.kafka_privatelink_root_domain_name
      dnsRecords             = { "all zones" = local.kafka_privatelink_zone_record }
      privateLinkServiceName = google_compute_service_attachment.services[0].id
      ports                  = [local.ports.kafka_pl_sasl]
      user                   = local.kafka_sasl_username
      password               = local.kafka_sasl_password
    },
  ] : []
}

output "deployment_name" {
  value = local.deployment_name
}

output "gcp_project_id" {
  value = var.gcp_project_id
}

output "gcp_region" {
  value = var.gcp_region
}

output "audit_labels" {
  value = local.labels
}

output "instance" {
  value = {
    id            = google_compute_instance.this.id
    name          = google_compute_instance.this.name
    zone          = local.gcp_zone
    desired_state = var.desired_state
  }
}

output "public_endpoints" {
  value = {
    public_ip      = google_compute_address.public.address
    service_access = "private-service-connect-only"
  }
}

output "privatelink" {
  value = {
    enabled = local.privatelink_enabled
    mysql = local.privatelink_enabled ? {
      service_attachment = google_compute_service_attachment.services[0].id
      port               = local.ports.mysql
    } : null
    kafka = local.privatelink_enabled ? {
      service_attachment = google_compute_service_attachment.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 = {
    bucket_name       = google_storage_bucket.test_data.name
    cdc_uri           = local.gcs_cdc_uri
    backup_export_uri = local.gcs_backup_export_uri
    service_account   = google_service_account.services.email
    external_access = {
      backup_export_service_accounts = sort([
        for grant in values(var.gcs_backup_export_access_grants) : grant.service_account_email
      ])
      cdc_service_accounts = sort([
        for grant in values(var.gcs_cdc_access_grants) : grant.service_account_email
      ])
    }
    lifecycle_days = 1
    auth_mode      = "service-account-iam"
  }
}

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

output "e2e_dependency_yaml" {
  sensitive = true
  value = yamlencode({
    kafka = local.e2e_kafka_dependencies
    mysql = local.e2e_mysql_dependencies
    gcs = [{
      bucketURI = local.gcs_cdc_uri
      region    = var.gcp_region
    }]
    backupExport = {
      gcp = {
        targetURI = local.gcs_backup_export_uri
        region    = var.gcp_region
      }
    }
  })
}
