data "alicloud_instance_types" "admin_node_available" {
  availability_zone = var.zone_ids[0]
}

locals {
  admin_node_candidate_instance_types = [
    "ecs.g9i.large",
    "ecs.g9i.xlarge",
    "ecs.g9i.2xlarge",
    "ecs.g9i.4xlarge",
    "ecs.g9i.8xlarge",
    "ecs.g9i.16xlarge",
    "ecs.r9i.2xlarge",
    "ecs.r9i.4xlarge",
    "ecs.r9i.8xlarge",
    "ecs.c9i.large",
    "ecs.c9i.xlarge",
    "ecs.c9i.2xlarge",
    "ecs.c9i.4xlarge",
    "ecs.c9i.8xlarge",
    "ecs.c9i.16xlarge",
  ]
  available_admin_node_instance_type_ids = toset(data.alicloud_instance_types.admin_node_available.instance_types[*].id)
  admin_node_instance_type = [
    for t in local.admin_node_candidate_instance_types :
    t if contains(local.available_admin_node_instance_type_ids, t)
  ][0]
}

module "dataplane-manager" {
  depends_on = [module.external-secrets-operator, module.kube-prometheus, module.victoria-metrics-operator]

  source = "../../modules/app"

  kubeconfig_path = module.kubeconfig.path
  workflow        = "deploy-new-region-next-gen-dataplane-manager.yaml"
  parameters = {
    cloud             = "alicloud"
    env               = var.env
    region            = var.cloud_region
    logicalRegionName = var.logical_region_name
    cluster           = local.cluster_name
    additionalArgs = jsonencode({
      alicloudRrsaRoleName         = module.ram.dataplane_manager_role_name
      dataplaneAssumedRoleName     = module.ram.dataplane_manager_assumed_role_names.0
      crossplaneAwsProviderRoleArn = module.aws_controlplane.crossplane_role_arn
      crossplaneAwsProviderName    = local.base_account
      availabilityZones            = var.zone_ids
      adminNodeInstanceType        = local.admin_node_instance_type
      kmsAccountID                 = local.seed_account
      kmsInstanceID                = local.kms_instance_id
      clusterAdminRoles = concat(
        [
          {
            id         = local.jumpserver_role_id
            iamRoleARN = local.jumpserver_role_arn
          }
        ],
        [
          for index, id in module.ram.dataplane_dbaas_dev_role_ids : {
            id         = id
            iamRoleARN = module.ram.dataplane_dbaas_dev_role_arns[index]
          }
        ],
        [
          for index, id in module.ram.dataplane_manager_assumed_role_ids : {
            id         = id
            iamRoleARN = module.ram.dataplane_manager_assumed_role_arns[index]
          }
        ]
      )
      imageRegistry            = local.image_registry
      tidbImageRegistry        = local.image_registry
      acrInstanceId            = local.cr_instance_id
      acrRegion                = local.cr_region
      acrPullRoleArn           = "acs:ram::${local.seed_account}:role/acrpullrole"
      dataplaneAccounts        = var.dataplane_accounts
      dnsAccountId             = local.seed_account
      dnsSecretName            = "alibabacloud-secret"
      dnsSecretNamespace       = "crossplane-system"
      publicHostedZoneDomain   = "${var.env}.aliyun.tidb-cloud.com"
      resourceNamePrefix       = "tidbcloud"
      auth0Audience            = "${var.env}-proxy-service"
      auth0Domain              = var.env == "prod" ? "tidb.auth0.com" : "tidb-${var.env}.us.auth0.com"
      globalControlplaneIPs    = formatlist("%s/32", local.base_outputs.public_ips.value)
      regionalControlplaneIPs  = formatlist("%s/32", module.ack.public_ips)
      o11yRegionalServiceIPs   = []
      clinicIPs                = formatlist("%s/32", local.clinic_outputs.public_ips.value)
      bastionIPs               = formatlist("%s/32", local.devops_outputs.public_ips.value)
      sliDeliveryStreamRoleArn = local.clinic_outputs.sli_delivery_stream_role_arn.value
      enableKongPublicAccess   = true
      aliCloudCommonBandwidthPackageIDMap = zipmap(
        var.dataplane_accounts,
        module.shared-bandwidth.shared_bandwidth_package_ids,
      )
    })
  }
  services = [
    {
      name      = "deploy/dataplane-controller"
      namespace = "dataplane-manager"
      wait_for  = "jsonpath='{.status.availableReplicas}'=REPLICAS"
    },
    {
      name      = "deploy/dataplane-server"
      namespace = "dataplane-manager"
      wait_for  = "jsonpath='{.status.availableReplicas}'=REPLICAS"
    }
  ]
}
