locals {
  cluster_name = "${var.env}-seed-${var.logical_region_name}"
  states = {
    "argocd" : "gke/argocd/${var.env}.json",
    "runner" : "gke/runner/prod.json",
    "base" : "aws/base/${var.env}.json",
    "clinic" : var.env == "dev" ? "aws/clinic/staging.json" : "aws/clinic/${var.env}.json",
    "devops" : var.env == "dev" ? "aws/devops/staging.json" : "aws/devops/${var.env}.json",
  }
}

data "aws_s3_object" "states" {
  for_each = local.states
  bucket   = "autonomous-deployment-terraform-state"
  key      = each.value

  provider = aws.tf_state
}

locals {
  base_outputs   = jsondecode(data.aws_s3_object.states["base"].body).outputs
  clinic_outputs = jsondecode(data.aws_s3_object.states["clinic"].body).outputs
  devops_outputs = jsondecode(data.aws_s3_object.states["devops"].body).outputs
  argocd_outputs = jsondecode(data.aws_s3_object.states["argocd"].body).outputs
  runner_outputs = jsondecode(data.aws_s3_object.states["runner"].body).outputs
}

# create ACK
module "ack" {
  source = "../../modules/ack"

  profile         = local.seed_account
  region          = var.cloud_region
  zone_ids        = var.zone_ids
  cluster_name    = local.cluster_name
  acr_region      = local.cr_region
  acr_instance_id = local.cr_instance_id
  public_access_cidrs = var.env == "dev" ? [] : concat(
    formatlist("%s/32", local.base_outputs.public_ips.value),
    formatlist("%s/32", local.devops_outputs.public_ips.value),
    formatlist("%s/32", local.argocd_outputs.public_ips.value),
    formatlist("%s/32", local.runner_outputs.public_ips.value),
  )
  admin_ram_ids = [for r in local.dbaas_dev_roles : r.id]
}

# create RAM in both controlplane and dataplane account
module "ram" {
  source = "./ram"

  env                 = var.env
  dataplane_accounts  = var.dataplane_accounts
  logical_region_name = var.logical_region_name
  cluster_name        = local.cluster_name
  oidc_issuer         = module.ack.oidc_issuer
  oidc_arn            = module.ack.oidc_arn
}

# Bootstrap a shared bandwidth package in every dataplane account for this region.
# The IDs are later consumed by dataplane-manager to associate EIPs with the package.
module "shared-bandwidth" {
  source = "./shared-bandwidth"

  cloud_region       = var.cloud_region
  dataplane_accounts = var.dataplane_accounts
}

# register the ACK to ArgoCD
module "argocd_cluster" {
  source = "../../modules/argocd_cluster"

  env    = var.env
  name   = local.cluster_name
  server = module.ack.endpoint
  data   = module.ack.argocd_config
}

module "kubeconfig" {
  source     = "../../modules/kubeconfig"
  kubeconfig = module.ack.kubeconfig
  path       = "/tmp/${local.cluster_name}-kubeconfig"

  depends_on = [module.ack, module.argocd_cluster]
}

module "region_registration" {
  depends_on          = [alicloud_alidns_record.kong-gateway-dns]
  source              = "../../modules/global_registration"
  env                 = var.env
  cloud_provider      = "alicloud"
  cloud_region        = var.cloud_region
  logical_region_name = var.logical_region_name
  deploy_type         = "DEPLOY_TYPE_NEXTGEN"
  service_plan        = "Premium"
  dataplane_accounts  = var.dataplane_accounts
  service_address     = "https://${local.host_record}.${local.domain_name}"
}
