locals {
  metering_writeonly_role_arn = "acs:ram::${local.seed_account}:role/${var.env}-metering-writer"
  metering_readwrite_role_arn = "acs:ram::${local.seed_account}:role/${var.env}-metering-writer"
}

resource "alicloud_oss_bucket" "metering-bucket" {
  bucket = "nextgen-metering-${var.env}-${var.logical_region_name}"
}

resource "alicloud_oss_bucket_acl" "bucket-acl" {
  bucket = alicloud_oss_bucket.metering-bucket.bucket
  acl    = "private"
}

module "cluster-ng-service-crds" {
  source = "../../modules/app"

  kubeconfig_path = module.kubeconfig.path
  workflow        = "deploy-new-region-cluster-ng-service-crds.yaml"
  parameters = {
    env               = var.env
    cloud             = "alicloud"
    region            = var.cloud_region
    cluster           = local.cluster_name
    logicalRegionName = var.logical_region_name
  }
  check_before_destroy = false
  services = [
    {
      name     = "CustomResourceDefinition/dataplaneproviders.clusterserver.ng.tidbcloud.com"
      wait_for = "condition=Established"
    },
    {
      name     = "CustomResourceDefinition/sharedpools.clusterserver.ng.tidbcloud.com"
      wait_for = "condition=Established"
    },
    {
      name     = "CustomResourceDefinition/tasks.clusterserver.ng.tidbcloud.com"
      wait_for = "condition=Established"
    },
    {
      name     = "CustomResourceDefinition/tidbgroups.clusterserver.ng.tidbcloud.com"
      wait_for = "condition=Established"
    }
  ]
}

module "cluster-ng-server" {
  source     = "../../modules/app"
  depends_on = [null_resource.alicloud_db_whitelist_template_attachment, module.o11y-agent-control-server]

  kubeconfig_path = module.kubeconfig.path
  workflow        = "deploy-new-region-cluster-ng-server.yaml"
  parameters = {
    env               = var.env
    cloud             = "alicloud"
    region            = var.cloud_region
    cluster           = local.cluster_name
    logicalRegionName = var.logical_region_name
    imageRegistry     = local.image_registry
    servicePlan       = var.service_plan
    args = jsonencode({
      image_registry              = local.image_registry
      irsa_role_name              = module.ram.dataplane_manager_role_name
      default_dataplane_account   = var.dataplane_accounts.0
      tidb_image_registry         = local.image_registry
      enable_pca                  = true
      metering_bucket             = alicloud_oss_bucket.metering-bucket.bucket
      metering_writeonly_role_arn = local.metering_writeonly_role_arn
      metering_readwrite_role_arn = local.metering_readwrite_role_arn
      is_byoc                     = false
      rds = {
        host                 = local.rds_host
        port                 = local.rds_port
        db                   = local.rds_cluster_service_db
        username             = local.rds_cluster_service_username
        password_secret_name = local.rds_cluster_service_password_secret_name
      }
    })
  }
  services = [
    {
      name      = "deploy/cluster-ng-server"
      namespace = "cluster-ng-service"
      wait_for  = "jsonpath='{.status.availableReplicas}'=REPLICAS"
    }
  ]
}
