resource "aws_cloudwatch_log_group" "dsms-resulting-clearances-stage" {
  #checkov:skip=CKV_AWS_338: Ensure CloudWatch log groups retains logs for at least 1 year
  name              = "/ecs/dsms-resulting-clearances-stage"
  retention_in_days = 7
}

resource "aws_ecs_task_definition" "dsms-resulting-clearances-stage" {
  family                   = "${lower(var.vpc_name)}-dsms-resulting-clearances-stage-td"
  network_mode             = "awsvpc"
  requires_compatibilities = ["FARGATE"]
  cpu                      = "2048"
  memory                   = "4096"
  execution_role_arn       = "arn:aws:iam::718729873097:role/ecsTaskExecutionRole"
  task_role_arn            = "arn:aws:iam::718729873097:role/dsms-task-role"

  container_definitions = jsonencode([
    {
      name      = "dsms-resulting-clearances"
      image     = "718729873097.dkr.ecr.eu-central-1.amazonaws.com/dsms/resulting-clearances:3.8.44" 
      essential = true

      portMappings = [{
        containerPort = 8102
        hostPort      = 8102
        protocol      = "tcp"
      }]

      healthCheck = {
        command     = ["CMD-SHELL", "curl -f http://localhost:8102/actuator/health || exit 1"]
        interval    = 30
        timeout     = 5
        retries     = 3
        startPeriod = 60
      }

      environment = [
        { name = "SPRING_PROFILES_ACTIVE", value = "stage" },
        { name = "JAVA_TOOL_OPTIONS", value = "-Xms1024m -Xmx2048m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp -Xlog:gc" }
      ]

      secrets = [
        {
          name      = "MONGO_DB_PASSWORD"
          valueFrom = "arn:aws:secretsmanager:eu-central-1:718729873097:secret:dsms-stage/config-m5yqgi:MONGO_DB_PASSWORD::"
        },
        {
          name      = "EUREKA_PASSWORD"
          valueFrom = "arn:aws:secretsmanager:eu-central-1:718729873097:secret:dsms-stage/config-m5yqgi:EUREKA_PASSWORD::"
        }
      ]

      logConfiguration = {
        logDriver = "awslogs"
        options = {
          awslogs-region        = var.region
          awslogs-group         = "/ecs/dsms-resulting-clearances-stage"
          awslogs-stream-prefix = "ecs"
        }
      }
    }
  ])
}


resource "aws_ecs_service" "dsms-resulting-clearances-stage" {
  name                               = "${lower(var.vpc_name)}-dsms-resulting-clearances-stage"
  cluster                            = "arn:aws:ecs:eu-central-1:718729873097:cluster/dsms-cluster"
  task_definition                    = aws_ecs_task_definition.dsms-resulting-clearances-stage.arn
  desired_count                      = 2
  launch_type                        = "FARGATE"
  platform_version                   = "LATEST"
  enable_execute_command             = true
  deployment_minimum_healthy_percent = 100
  deployment_maximum_percent         = 200

  network_configuration {
    subnets          = [aws_subnet.DIGSYS-S3-XAPP-1A.id, aws_subnet.DIGSYS-S3-XAPP-1B.id]
    security_groups  = [aws_security_group.DIGSYS-S3-DSMS-RS-CLEARANCES-SG.id]
    assign_public_ip = false
  }

  load_balancer {
    target_group_arn = aws_lb_target_group.digsys-s3-dsms-rs-clearances[0].arn
    container_name   = "dsms-resulting-clearances"
    container_port   = 8102
  }

  depends_on = [aws_lb_listener.digsys-s3-dsms-rs-clearances[0]]

  lifecycle {
    ignore_changes = [desired_count]
  }
}

resource "aws_cloudwatch_metric_alarm" "dsms_resulting_clearances_stage_running_count_low" {
  alarm_name        = "${lower(var.vpc_name)}-dsms-resulting-clearances-stage-running-count-low"
  alarm_description = "Triggers when RunningTaskCount for dsms-resulting-clearances-stage is less than 2"
  namespace         = "ECS/ContainerInsights"
  metric_name       = "RunningTaskCount"
  dimensions = {
    ClusterName = "dsms-cluster"
    ServiceName = aws_ecs_service.dsms-resulting-clearances-stage.name
  }
  statistic           = "Minimum"
  period              = 60
  evaluation_periods  = 1
  threshold           = 2
  comparison_operator = "LessThanThreshold"
  treat_missing_data  = "missing"
  alarm_actions       = [aws_sns_topic.dsms_stage_alerts.arn]
  ok_actions          = [aws_sns_topic.dsms_stage_alerts.arn]
}

resource "aws_appautoscaling_target" "dsms_resulting_clearances_stage" {
  max_capacity       = 10
  min_capacity       = 2
  resource_id        = "service/dsms-cluster/${aws_ecs_service.dsms-resulting-clearances-stage.name}"
  scalable_dimension = "ecs:service:DesiredCount"
  service_namespace  = "ecs"
}

resource "aws_appautoscaling_policy" "dsms_resulting_clearances_stage_cpu" {
  name               = "${lower(var.vpc_name)}-dsms-resulting-clearances-stage-cpu-scaling"
  policy_type        = "TargetTrackingScaling"
  resource_id        = aws_appautoscaling_target.dsms_resulting_clearances_stage.resource_id
  scalable_dimension = aws_appautoscaling_target.dsms_resulting_clearances_stage.scalable_dimension
  service_namespace  = aws_appautoscaling_target.dsms_resulting_clearances_stage.service_namespace

  target_tracking_scaling_policy_configuration {
    predefined_metric_specification {
      predefined_metric_type = "ECSServiceAverageCPUUtilization"
    }
    target_value       = 70.0
    scale_in_cooldown  = 300
    scale_out_cooldown = 60
  }
}

resource "aws_appautoscaling_policy" "dsms_resulting_clearances_stage_memory" {
  name               = "${lower(var.vpc_name)}-dsms-resulting-clearances-stage-memory-scaling"
  policy_type        = "TargetTrackingScaling"
  resource_id        = aws_appautoscaling_target.dsms_resulting_clearances_stage.resource_id
  scalable_dimension = aws_appautoscaling_target.dsms_resulting_clearances_stage.scalable_dimension
  service_namespace  = aws_appautoscaling_target.dsms_resulting_clearances_stage.service_namespace

  target_tracking_scaling_policy_configuration {
    predefined_metric_specification {
      predefined_metric_type = "ECSServiceAverageMemoryUtilization"
    }
    target_value       = 80.0
    scale_in_cooldown  = 300
    scale_out_cooldown = 60
  }
}


