locals {
  name    = "${var.env_prefix}-${var.project_group}-${var.project}"
  tg_name = length(local.name) > 32 ? "${var.env_prefix}-${var.project_group}-${random_string.tg_id.result}" : local.name
}

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

# Target group for ECS service
resource "aws_lb_target_group" "main" {
  name                 = local.tg_name
  port                 = var.tg_port
  protocol             = "HTTP"
  vpc_id               = var.vpc_id
  deregistration_delay = var.tg_deregistration_delay
  target_type          = "ip"

  health_check {
    path     = var.tg_health_check_path
    port     = "traffic-port"
    protocol = "HTTP"
    matcher  = var.tg_health_check_matcher
  }

  tags = var.common_tags
}

# ALB rules for
module "alb_rules" {
  source             = "../../../ec2/alb/https_rule_with_redirect"
  https_listener_arn = var.https_listener_arn
  tg_arn             = aws_lb_target_group.main.arn
  host-header        = var.url
}

# ECS Service
resource "aws_ecs_service" "main" {
  name                               = local.name
  cluster                            = var.cluster_arn
  task_definition                    = module.task_definition_main.ecs_task_definition.arn
  launch_type                        = "FARGATE"
  desired_count                      = var.task_count
  deployment_minimum_healthy_percent = var.deployment_minimum_healthy_percent
  deployment_maximum_percent         = var.deployment_maximum_percent

  load_balancer {
    target_group_arn = aws_lb_target_group.main.arn
    container_name   = var.project
    container_port   = var.container_port
  }

  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]
  }
}

module "task_definition_main" {
  source = "../../../ecs/tasks/fargate_with_dd_v2"

  # datadog configuration
  dd_api_key_secret = var.dd_api_key_secret
  dd_log_group_name = var.dd_log_group_name
  dd_docker_image   = var.dd_docker_image
  dd_apm_enabled    = var.dd_apm_enabled
  dd_logs_injection = var.dd_logs_injection

  # task definition
  env_prefix         = var.env_prefix
  cpu                = var.cpu
  memory             = var.memory
  project            = var.project
  project_group      = var.project_group
  task_exec_role_arn = var.task_exec_role_arn
  task_family        = local.name
  task_role_arn      = var.task_role_arn
  common_tags        = var.common_tags

  # container definition
  secrets              = var.secrets
  region               = var.region
  image                = var.image
  container_port       = var.container_port
  env_vars             = var.env_vars
  port_mapping_enabled = true
}

resource "aws_route53_record" "www" {
  count   = var.route53_zone_id == "" ? 0 : 1
  zone_id = var.route53_zone_id
  name    = var.url
  type    = "A"

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