resource "random_integer" "port_base" {
  min = 20000
  max = 60000
}

resource "random_password" "mysql_root" {
  length  = 32
  special = false
}

resource "random_password" "mysql" {
  length  = 32
  special = false
}

resource "random_string" "kafka_username" {
  length  = 8
  upper   = false
  special = false
}

resource "random_password" "kafka" {
  length  = 32
  special = false
}

resource "random_string" "schema_registry_username" {
  length  = 8
  upper   = false
  special = false
}

resource "random_password" "schema_registry" {
  length  = 32
  special = false
}

resource "random_id" "pulsar_secret" {
  byte_length = 32
}

resource "random_id" "kafka_cluster_id" {
  byte_length = 16
}

resource "random_id" "deployment" {
  byte_length = 6

  keepers = {
    region = var.alicloud_region
  }
}

data "alicloud_account" "current" {}
data "alicloud_nlb_zones" "available" {}
data "alicloud_zones" "ecs" {
  available_instance_type     = var.instance_type
  available_resource_creation = "Instance"
  instance_charge_type        = "PostPaid"
  network_type                = "Vpc"
  spot_strategy               = "NoSpot"
}

locals {
  deployment_name = "${var.name_prefix}-${random_id.deployment.hex}"
  tags = {
    environment        = "test"
    managedby          = "terraform"
    owner              = "date-integration"
    project            = var.name_prefix
    dataclassification = "test"
    usedby             = local.deployment_name
  }

  port_base = coalesce(var.port_base, random_integer.port_base.result)
  ports = {
    mysql             = local.port_base
    kafka_public      = local.port_base + 17
    kafka_sasl        = local.port_base + 41
    kafka_pl_public   = local.port_base + 73
    kafka_pl_sasl     = local.port_base + 109
    pulsar_binary     = local.port_base + 151
    pulsar_admin_http = local.port_base + 197
    schema_registry   = local.port_base + 239
  }

  mysql_root_password      = coalesce(var.mysql_root_password, random_password.mysql_root.result)
  mysql_password           = coalesce(var.mysql_password, random_password.mysql.result)
  kafka_sasl_username      = coalesce(var.kafka_sasl_username, "e2e_${random_string.kafka_username.result}")
  kafka_sasl_password      = coalesce(var.kafka_sasl_password, random_password.kafka.result)
  schema_registry_username = coalesce(var.schema_registry_username, "e2e_${random_string.schema_registry_username.result}")
  schema_registry_password = coalesce(var.schema_registry_password, random_password.schema_registry.result)
  pulsar_token_secret      = coalesce(var.pulsar_token_secret, random_id.pulsar_secret.b64_std)
  kafka_cluster_id         = random_id.kafka_cluster_id.b64_url

  nlb_zone_ids                        = [for zone in data.alicloud_nlb_zones.available.zones : zone.zone_id]
  default_provisioned_zone_ids        = slice(local.nlb_zone_ids, 0, min(2, length(local.nlb_zone_ids)))
  compatible_ecs_zone_ids             = sort(tolist(setintersection(toset(local.nlb_zone_ids), toset(data.alicloud_zones.ecs.ids))))
  compatible_provisioned_ecs_zone_ids = sort(tolist(setintersection(toset(local.default_provisioned_zone_ids), toset(data.alicloud_zones.ecs.ids))))
  service_zone_id                     = try(local.compatible_provisioned_ecs_zone_ids[0], try(local.compatible_ecs_zone_ids[0], try(local.nlb_zone_ids[0], "")))
  provisioned_zone_ids = contains(local.default_provisioned_zone_ids, local.service_zone_id) ? local.default_provisioned_zone_ids : concat(
    slice(local.default_provisioned_zone_ids, 0, min(1, length(local.default_provisioned_zone_ids))),
    [local.service_zone_id],
  )
  service_vswitch_index = try(index(local.provisioned_zone_ids, local.service_zone_id), 0)

  privatelink_enabled               = var.desired_state == "running" || !var.remove_privatelink_when_stopped
  kafka_privatelink_zone_record     = "${var.alicloud_region}.${var.kafka_privatelink_root_domain_name}"
  kafka_privatelink_advertised_host = "b1.${local.kafka_privatelink_zone_record}"
  oss_bucket_name                   = coalesce(var.oss_bucket_name, "dit-${random_id.deployment.hex}")
  oss_cdc_uri                       = "oss://${local.oss_bucket_name}/cdc/"
  oss_backup_export_uri             = "oss://${local.oss_bucket_name}/backup-export/"
  oss_import_uri                    = "oss://${local.oss_bucket_name}/import/csv/"
  oss_public_endpoint               = "oss-${var.alicloud_region}.aliyuncs.com"
  e2e_import_sample_data_oss = {
    sourceURL       = local.oss_import_uri
    endpoint        = "https://${local.oss_public_endpoint}"
    accessKeyID     = alicloud_ram_access_key.import.id
    accessKeySecret = alicloud_ram_access_key.import.secret
    importedDBTable = {
      database = "test"
      table    = "a"
    }
    customCSVFormat = {
      delimiter      = "\""
      escapeChar     = "\\"
      lineTerminator = "\n"
      nullValue      = "\\N"
      separator      = ";"
      skipRows       = 1
      splitFile      = false
    }
  }

  images = {
    mysql           = "mysql:8.4.11@sha256:b3b90af2a6552ae30c266fdb7d5dd55f3afb72404bb78d37fe8a23eb857fd3fb"
    kafka           = "apache/kafka:3.9.2@sha256:05b4616e0702ef2729327705d54ad6b50ea70b271c4b730fabd2320789fb7b02"
    pulsar          = "apachepulsar/pulsar:3.3.9@sha256:edb08c608371bc69a92a0edda255e869cef404577b9ca995cbe98e0c0de10e0e"
    kafka_proxy     = "grepplabs/kafka-proxy:0.4.3-all@sha256:95c1b7a1136613f630902aeec25909c35e1002d202dd3a3eb5d6188543775787"
    schema_registry = "confluentinc/cp-schema-registry:7.8.0@sha256:ae0695b092314be82fe32058c276d99224855090a77ec169423cf82e02d5e3ac"
  }
}

data "external" "pulsar_proxy_token" {
  program = ["python3", "${path.module}/../../scripts/create_pulsar_token.py"]
  query = {
    secret  = local.pulsar_token_secret
    subject = "proxy"
  }
}

data "external" "pulsar_admin_token" {
  program = ["python3", "${path.module}/../../scripts/create_pulsar_token.py"]
  query = {
    secret  = local.pulsar_token_secret
    subject = "admin"
  }
}

data "external" "pulsar_client_token" {
  program = ["python3", "${path.module}/../../scripts/create_pulsar_token.py"]
  query = {
    secret  = local.pulsar_token_secret
    subject = "e2e-client"
  }
}
