
locals {
  name            = "${var.env_prefix}-${var.project_group}-${var.project}"
  route53_records = var.route53_zone_id == "" ? [] : var.target_groups_settings[*].url

  sd_enabled = var.sd_enabled ? ["Enabled"] : []
}

resource "random_string" "tg_id" {
  length  = 16
  special = false
}

# Target group for ECS service
resource "aws_lb_target_group" "this" {
  for_each = { for tg in var.target_groups_settings : tg.name => tg }

  name                 = "${var.env_prefix}-${var.project_group}-${each.value.name}"
  port                 = each.value.tg_port
  protocol             = "HTTP"
  vpc_id               = var.vpc_id
  deregistration_delay = each.value.deregistration_delay
  target_type          = "ip"

  health_check {
    path     = each.value.health_check_path
    port     = lookup(each.value, "health_check_port", "traffic-port")
    protocol = "HTTP"
    matcher  = each.value.health_check_matcher
  }

  tags = var.common_tags

  # fixes: Error deleting Target Group: ResourceInUse
  lifecycle {
    create_before_destroy = true
    ignore_changes        = [name]
  }
}

# ALB rules for
module "alb_rules" {
  for_each           = { for tg in var.target_groups_settings : tg.name => tg }
  source             = "../../../ec2/alb/https_rule_with_redirect"
  https_listener_arn = each.value.https_listener_arn
  tg_arn             = aws_lb_target_group.this[each.key].arn
  host-header        = each.value.url
}

resource "aws_service_discovery_service" "main" {
  count = var.sd_enabled ? 1 : 0

  name = var.project

  dns_config {
    namespace_id = var.namespace_id

    dns_records {
      ttl  = 10
      type = "A"
    }

    routing_policy = "MULTIVALUE"
  }

  health_check_custom_config {
    failure_threshold = 1
  }

  tags = var.common_tags

  # Remove after https://github.com/terraform-providers/terraform-provider-aws/issues/4853 is resolved
  # provisioner "local-exec" {
  #   when    = destroy
  #   command = "${path.module}/servicediscovery-drain.sh ${self.id}"
  # }
}

# ECS Service
resource "aws_ecs_service" "this" {
  name             = local.name
  cluster          = var.cluster_arn
  task_definition  = var.task_definition_arn
  launch_type      = "FARGATE"
  platform_version = var.platform_version

  desired_count                      = var.desired_count
  deployment_minimum_healthy_percent = var.min_percent
  deployment_maximum_percent         = var.max_percent

  dynamic "load_balancer" {
    for_each = { for tg in var.target_groups_settings : tg.name => tg }
    content {
      target_group_arn = aws_lb_target_group.this[load_balancer.key].arn
      container_name   = var.project
      container_port   = load_balancer.value.container_port
    }
  }

  dynamic "service_registries" {
    for_each = local.sd_enabled
    content {
      registry_arn   = join("", aws_service_discovery_service.main.*.arn)
      container_name = var.project
    }
  }

  network_configuration {
    subnets          = var.subnets
    security_groups  = var.security_groups
    assign_public_ip = var.is_public
  }

  enable_ecs_managed_tags = var.enable_ecs_managed_tags
  propagate_tags          = var.enable_ecs_managed_tags ? "TASK_DEFINITION" : null
  tags                    = var.common_tags

  wait_for_steady_state = var.wait_for_steady_state

  lifecycle {
    ignore_changes = [desired_count]
  }
}

resource "aws_route53_record" "this" {
  for_each = toset(local.route53_records)
  zone_id  = var.route53_zone_id
  name     = each.value
  type     = "A"

  alias {
    name                   = var.alb_dns_name
    zone_id                = var.alb_zone_id
    evaluate_target_health = var.route53_eval_health
  }
}
