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

output "deployment_name" {
  value = local.deployment_name
}

output "alicloud_account_id" {
  value = data.alicloud_account.current.id
}

output "audit_tags" {
  value = local.tags
}

output "instance" {
  value = {
    id            = alicloud_instance.services.id
    name          = alicloud_instance.services.instance_name
    desired_state = var.desired_state
    public_ip     = alicloud_eip_address.services.ip_address
  }
}

output "public_endpoints" {
  value = {
    public_ip      = alicloud_eip_address.services.ip_address
    service_access = "private-link-only"
    public_ingress = []
  }
}

output "privatelink" {
  value = {
    enabled = local.privatelink_enabled
    mysql = local.privatelink_enabled ? {
      service_name = alicloud_privatelink_vpc_endpoint_service.services[0].vpc_endpoint_service_name
      service_id   = alicloud_privatelink_vpc_endpoint_service.services[0].id
      port         = local.ports.mysql
      zones        = [for vswitch in alicloud_vswitch.services : vswitch.zone_id]
    } : null
    kafka = local.privatelink_enabled ? {
      service_name     = alicloud_privatelink_vpc_endpoint_service.services[0].vpc_endpoint_service_name
      service_id       = alicloud_privatelink_vpc_endpoint_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
      zones            = [for vswitch in alicloud_vswitch.services : vswitch.zone_id]
    } : null
  }
}

output "object_storage" {
  value = {
    bucket_name       = alicloud_oss_bucket.test_data.bucket
    cdc_uri           = local.oss_cdc_uri
    backup_export_uri = local.oss_backup_export_uri
    import_uri        = local.oss_import_uri
    intranet_endpoint = alicloud_oss_bucket.test_data.intranet_endpoint
    public_endpoint   = local.oss_public_endpoint
    lifecycle_days    = 1
    auth_mode         = "ecs-ram-role"
    ram_role_name     = alicloud_ram_role.services.role_name
  }
}

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 }
    oss = {
      access_key_id     = alicloud_ram_access_key.import.id
      secret_access_key = alicloud_ram_access_key.import.secret
    }
    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
    importSampleData = {
      oss = local.e2e_import_sample_data_oss
    }
  })
}
