locals {
  # One SQS queue (+ DLQ) per fan-collect client — same set of clients as the
  # fan-collect lambdas. terraform-sqs names the resources as:
  #   queue: ${var.environment}-${var.service_name}-fan-collect-<key>-queue
  #   DLQ:   ${var.environment}-${var.service_name}-fan-collect-<key>-deadletter
  fan_collect_queues = toset(keys(local.fan_collect_lambdas))

  # Shared config applied to every fan-collect queue.
  fan_collect_queue = {
    max_message_size               = 262144
    visibility_timeout             = var.fan_collect_worker_timeout_s + 60 # lambda timeout + margin
    message_retention              = 345600
    dlq_max_receive_count          = 3
    dlq_message_retention          = 1209600
    queue_depth_critical_threshold = 500
    dlq_depth_critical_threshold   = 10
  }
}

module "sqs_fan_collect" {
  source   = "git@github.com:theorchard/terraform-sqs.git?ref=2.4.1"
  for_each = local.fan_collect_queues

  environment        = var.environment
  application_family = var.application_family
  queue_name         = "${var.service_name}-fan-collect-${each.key}"

  sqs_max_message_size           = local.fan_collect_queue.max_message_size
  sqs_visibility_timeout_seconds = local.fan_collect_queue.visibility_timeout
  sqs_message_retention_seconds  = local.fan_collect_queue.message_retention
  sqs_fifo_queue                 = "false"

  sqs_deadletter_enabled               = true
  deadletter_max_message_size          = local.fan_collect_queue.max_message_size
  deadletter_max_receive_count         = local.fan_collect_queue.dlq_max_receive_count
  deadletter_message_retention_seconds = local.fan_collect_queue.dlq_message_retention
}

data "aws_iam_policy_document" "fan_collect_sqs_send_policy_document" {
  statement {
    effect = "Allow"
    actions = [
      "sqs:SendMessage",
      "sqs:SendMessageBatch",
      "sqs:GetQueueUrl",
      "sqs:GetQueueAttributes",
    ]
    resources = [for q in module.sqs_fan_collect : q.queue_arn]
  }
}

resource "aws_iam_policy" "fan_collect_sqs_send_policy" {
  name        = "SQS-${var.environment}-${var.service_name}-fan-collect-SendMessage"
  description = "Allow publishing messages to fan-collect SQS queues for ${var.service_name}"
  policy      = data.aws_iam_policy_document.fan_collect_sqs_send_policy_document.json
}

resource "datadog_monitor" "fan_collect_queue_depth" {
  for_each = local.fan_collect_queues

  name    = "${var.environment}-${var.service_name}-fan-collect-${each.key}-queue-depth"
  type    = "metric alert"
  message = "fan-collect-${each.key} queue depth too high. Check if the consumer lambda is healthy. @slack-fansifter-alerts"

  query = "avg(last_15m):aws.sqs.approximate_number_of_messages_visible{queuename:${module.sqs_fan_collect[each.key].queue_name}} > ${local.fan_collect_queue.queue_depth_critical_threshold}"

  monitor_thresholds {
    critical = local.fan_collect_queue.queue_depth_critical_threshold
  }

  renotify_interval   = 60
  require_full_window = false

  tags = [
    "environment:${var.environment}",
    "service:lambda-resonance-engine-fan-collect-${each.key}",
    "team:${var.application_family}",
  ]
}

resource "datadog_monitor" "fan_collect_dlq_depth" {
  for_each = local.fan_collect_queues

  name    = "${var.environment}-${var.service_name}-fan-collect-${each.key}-dlq"
  type    = "metric alert"
  message = "Messages on fan-collect-${each.key} DLQ are not being drained. Check lambda-resonance-engine-fan-collect-dlq health — it should auto-drain this queue. @slack-fansifter-alerts"

  query = "max(last_5m):aws.sqs.approximate_number_of_messages_visible{queuename:${var.environment}-${var.service_name}-fan-collect-${each.key}-deadletter} >= ${local.fan_collect_queue.dlq_depth_critical_threshold}"

  monitor_thresholds {
    critical = local.fan_collect_queue.dlq_depth_critical_threshold
  }

  renotify_interval   = 60
  require_full_window = false

  tags = [
    "environment:${var.environment}",
    "service:lambda-resonance-engine-fan-collect-${each.key}",
    "team:${var.application_family}",
  ]
}
