locals {
  kong_gateway_ip = try(data.kubernetes_service_v1.kong_svc[0].status.0.load_balancer.0.ingress.0.ip, "0.0.0.0")
  kong_ingress_controller_additional_args = {
    imageRegistry         = local.image_registry
    globalControlplaneIPs = local.global_controlplane_ips
  }
}

data "azurerm_dns_zone" "controlplane" {
  name                = local.controlplane_domain_name
  resource_group_name = local.controlplane_dns_zone_rg
}

module "gateway_crds" {
  depends_on = [module.cert_manager, module.gateway_api_crds]
  source     = "../../modules/app"

  kubeconfig_path = module.kubeconfig.path
  workflow        = "deploy-new-region-next-gen-gateway-crds.yaml"
  parameters = {
    cloud             = "azure"
    env               = var.env
    region            = var.cloud_region
    logicalRegionName = var.logical_region_name
    cluster           = module.argocd_cluster.name
    dnsName           = "${local.regional_api_host_record}.${local.controlplane_domain_name}"
  }
  services = [
    {
      name      = "Certificate/regional-api"
      namespace = "kong"
      wait_for  = "condition=Ready"
    },
    {
      name      = "Gateway/kong"
      namespace = "kong"
    }
  ]
}

module "kong_ingress_controller" {
  depends_on = [module.gateway_crds, module.gateway_api_crds]
  source     = "../../modules/app"

  kubeconfig_path = module.kubeconfig.path
  workflow        = "deploy-new-region-next-gen-kong-ingress-controller.yaml"
  parameters = {
    cloud             = "azure"
    env               = var.env
    region            = var.cloud_region
    logicalRegionName = var.logical_region_name
    cluster           = module.argocd_cluster.name
    additionalArgs    = jsonencode(local.kong_ingress_controller_additional_args)
  }
  services = [
    {
      name      = "deploy/kong-kong"
      namespace = "kong"
      wait_for  = "jsonpath='{.status.availableReplicas}'=REPLICAS"
    },
    {
      name      = "service/kong-kong-proxy"
      namespace = "kong"
      wait_for  = "jsonpath='{.status.loadBalancer.ingress}'"
    }
  ]
}

data "kubernetes_service_v1" "kong_svc" {
  count      = var.destroy_mode ? 0 : 1
  depends_on = [module.kong_ingress_controller]

  metadata {
    name      = "kong-kong-proxy"
    namespace = "kong"
  }

  lifecycle {
    postcondition {
      condition     = self.status == null || can(self.status.0.load_balancer.0.ingress.0.ip)
      error_message = "can't get IP for kong-kong-proxy"
    }
  }
}

resource "azurerm_dns_a_record" "kong_gateway_dns" {
  name                = local.regional_api_host_record
  zone_name           = data.azurerm_dns_zone.controlplane.name
  resource_group_name = data.azurerm_dns_zone.controlplane.resource_group_name
  ttl                 = 3600
  records             = [local.kong_gateway_ip]
  tags                = local.tags

  lifecycle {
    precondition {
      condition     = var.destroy_mode || local.kong_gateway_ip != ""
      error_message = "kong-kong-proxy does not have a load balancer IP yet."
    }
  }
}
