data "aws_ecr_repository" "kong" {
  name = "delphi/kong"
}

module "kong_role" {
  source              = "../../../modules/iam/roles/ecs_task_role"
  enable_default_role = false
  name_prefix         = local.name_prefix
  name                = "kong_role"
  common_tags = merge(
    local.common_tags,
    {
      project                  = "SLZ API",
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_APPA_ECS"
    }
  )
  policies_list = [
    data.aws_iam_policy.secrets-services-ro.arn,
    data.aws_iam_policy.logging.arn,
  ]
}

module "kong_task_def" {
  source = "../../../modules/ecs/tasks/fargate_v3"

  env_prefix      = local.env_prefix
  project_group   = local.project_group
  family          = "${local.env_prefix}-${local.project_group}-kong"
  container_name  = "kong"
  container_image = "${data.aws_ecr_repository.kong.repository_url}:${local.docker_image_env_tag[var.platform.prefix]}"
  cpu             = 1024
  memory          = 4096

  task_role_arn = module.kong_role.role.arn
  exec_role_arn = data.aws_iam_role.standard_exec.arn

  env_vars = [
    {
      name  = "KONG_DECLARATIVE_CONFIG",
      value = "/usr/local/kong/declarative/configs/${local.env_prefix}/kong.yml"
    },
  ]

  port_mappings = [
    {
      containerPort = 8000
      hostPort      = 8000
      protocol      = "tcp"
    },
    {
      containerPort = 8001
      hostPort      = 8001
      protocol      = "tcp"
    },
  ]

  ulimits = [
    {
      name      = "nofile"
      hardLimit = 4096
      softLimit = 4096
    }
  ]

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Public Data",
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_PD_ECS"
    }
  )
}

module "kong_service" {
  source = "../../../modules/ecs/services/service_taskless_multi_tg"

  env_prefix    = local.env_prefix
  project       = "kong"
  project_group = local.project_group

  cluster_arn   = data.aws_ecs_cluster.main.arn
  desired_count = 1

  security_groups = [data.aws_security_group.main.id]
  subnets         = data.aws_subnets.private_subnets.ids
  vpc_id          = data.aws_vpc.main.id

  route53_zone_id = data.aws_route53_zone.default.zone_id
  alb_dns_name    = data.aws_lb.internal_alb.dns_name
  alb_zone_id     = data.aws_lb.internal_alb.zone_id

  task_definition_arn = module.kong_task_def.arn

  target_groups_settings = [
    {
      name                 = "kong",
      tg_port              = 80,
      container_port       = 8000,
      deregistration_delay = 60,
      health_check_path    = "/",
      health_check_port    = "traffic-port",
      health_check_matcher = "200-499",
      url                  = "${lower(var.platform.prefix)}-kong.delphiplatform.io",
      https_listener_arn   = data.aws_lb_listener.internal_https_listener.arn
    },
    {
      name                 = "kong-admin",
      tg_port              = 80,
      container_port       = 8001,
      deregistration_delay = 60,
      health_check_path    = "/",
      health_check_port    = "traffic-port",
      health_check_matcher = "200-499",
      url                  = "${lower(var.platform.prefix)}-kong-admin.delphiplatform.io",
      https_listener_arn   = data.aws_lb_listener.internal_https_listener.arn
    }
  ]

  enable_ecs_managed_tags = true

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Public Data",
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_PD_ECS"
    }
  )
}
