terraform {
  required_providers {
    alicloud = {
      source  = "aliyun/alicloud"
      version = ">= 1.268"
    }
  }
}

# terraform doesn't support dynamic count of providers, so we hard code 3 here
provider "alicloud" {
  profile = var.dataplane_accounts.0
  alias   = "dp_0"
}

provider "alicloud" {
  profile = try(var.dataplane_accounts.1, var.dataplane_accounts.0)
  alias   = "dp_1"
}

provider "alicloud" {
  profile = try(var.dataplane_accounts.2, var.dataplane_accounts.0)
  alias   = "dp_2"
}

variable "env" {
  type = string
}

variable "dataplane_accounts" {
  type = list(string)

  validation {
    condition     = length(var.dataplane_accounts) > 0
    error_message = "at least one dataplane account needs to be provided"
  }
}

variable "logical_region_name" {
  type = string
}

variable "cluster_name" {
  type = string
}

variable "oidc_issuer" {
  type = string
}

variable "oidc_arn" {
  type = string
}

module "cert_manager" {
  source                = "../../alicloud_modules/ram/cert-manager/controlplane"
  env                   = var.env
  logical_region_name   = var.logical_region_name
  oidc_issuer           = var.oidc_issuer
  oidc_arn              = var.oidc_arn
  auto_deploy_owner_tag = var.cluster_name
}

module "eso" {
  source                = "../../alicloud_modules/ram/external-secrets-operator/controlplane"
  env                   = var.env
  logical_region_name   = var.logical_region_name
  oidc_issuer           = var.oidc_issuer
  oidc_arn              = var.oidc_arn
  auto_deploy_owner_tag = var.cluster_name
}

module "dataplane_manager" {
  source                = "../../alicloud_modules/ram/dataplane-manager/controlplane"
  env                   = var.env
  logical_region_name   = var.logical_region_name
  oidc_issuer           = var.oidc_issuer
  oidc_arn              = var.oidc_arn
  auto_deploy_owner_tag = var.cluster_name
}

locals {
  dp_accounts = length(var.dataplane_accounts)
}

module "dataplane_manager_assumed_0" {
  count  = local.dp_accounts > 0 ? 1 : 0
  source = "../../alicloud_modules/ram/dataplane-manager/dataplane"
  providers = {
    alicloud = alicloud.dp_0
  }
  env                    = var.env
  logical_region_name    = var.logical_region_name
  controlplane_role_arns = [module.dataplane_manager.role_arn]
  auto_deploy_owner_tag  = var.cluster_name
}

module "dataplane_manager_assumed_1" {
  count  = local.dp_accounts > 1 ? 1 : 0
  source = "../../alicloud_modules/ram/dataplane-manager/dataplane"
  providers = {
    alicloud = alicloud.dp_1
  }
  env                    = var.env
  logical_region_name    = var.logical_region_name
  controlplane_role_arns = [module.dataplane_manager.role_arn]
  auto_deploy_owner_tag  = var.cluster_name
}


module "dataplane_manager_assumed_2" {
  count  = local.dp_accounts > 2 ? 1 : 0
  source = "../../alicloud_modules/ram/dataplane-manager/dataplane"
  providers = {
    alicloud = alicloud.dp_2
  }
  env                    = var.env
  logical_region_name    = var.logical_region_name
  controlplane_role_arns = [module.dataplane_manager.role_arn]
  auto_deploy_owner_tag  = var.cluster_name
}

output "cert_manager_role_name" {
  value = module.cert_manager.role_name
}

output "dataplane_manager_role_name" {
  value = module.dataplane_manager.role_name
}

output "dataplane_manager_role_arn" {
  value = module.dataplane_manager.role_arn
}

output "dataplane_manager_assumed_role_ids" {
  value = compact([
    try(module.dataplane_manager_assumed_0.0.role_id, ""),
    try(module.dataplane_manager_assumed_1.0.role_id, ""),
    try(module.dataplane_manager_assumed_2.0.role_id, ""),
  ])
}

output "dataplane_manager_assumed_role_names" {
  value = compact([
    try(module.dataplane_manager_assumed_0.0.role_name, ""),
    try(module.dataplane_manager_assumed_1.0.role_name, ""),
    try(module.dataplane_manager_assumed_2.0.role_name, ""),
  ])
}

output "dataplane_manager_assumed_role_arns" {
  value = compact([
    try(module.dataplane_manager_assumed_0.0.role_arn, ""),
    try(module.dataplane_manager_assumed_1.0.role_arn, ""),
    try(module.dataplane_manager_assumed_2.0.role_arn, ""),
  ])
}

output "dataplane_dbaas_dev_role_ids" {
  value = compact([
    try(module.dataplane_manager_assumed_0.0.dbbas_dev_role_id, ""),
    try(module.dataplane_manager_assumed_1.0.dbbas_dev_role_id, ""),
    try(module.dataplane_manager_assumed_2.0.dbbas_dev_role_id, ""),
  ])
}

output "dataplane_dbaas_dev_role_names" {
  value = compact([
    try(module.dataplane_manager_assumed_0.0.dbbas_dev_role_name, ""),
    try(module.dataplane_manager_assumed_1.0.dbbas_dev_role_name, ""),
    try(module.dataplane_manager_assumed_2.0.dbbas_dev_role_name, ""),
  ])
}

output "dataplane_dbaas_dev_role_arns" {
  value = compact([
    try(module.dataplane_manager_assumed_0.0.dbbas_dev_role_arn, ""),
    try(module.dataplane_manager_assumed_1.0.dbbas_dev_role_arn, ""),
    try(module.dataplane_manager_assumed_2.0.dbbas_dev_role_arn, ""),
  ])
}

output "external_secrets_operator_role_id" {
  value = module.eso.role_id
}

output "external_secrets_operator_role_name" {
  value = module.eso.role_name
}

output "external_secrets_operator_role_arn" {
  value = module.eso.role_arn
}