# SQS event mapping

resource "aws_lambda_permission" "allow_execution_from_queue" {
  count         = var.sqs_event_enabled ? 1 : 0
  statement_id  = "${var.environment}-${replace(var.event_source_mapping_queue_name, ".", "-")}-lambda-AllowSQSPermissions"
  action        = "lambda:InvokeFunction"
  function_name = aws_lambda_function.function.arn
  principal     = "sqs.amazonaws.com"
  source_arn    = "arn:aws:sqs:${var.event_source_mapping_region}:${data.aws_caller_identity.current.account_id}:${var.event_source_mapping_queue_name}"
}

# SQS policy for lambda
data "aws_iam_policy_document" "lambda_sqs_policy" {
  statement {
    effect    = "Allow"
    resources = ["arn:aws:sqs:${var.event_source_mapping_region}:${data.aws_caller_identity.current.account_id}:${var.event_source_mapping_queue_name}"]

    actions = [
      "sqs:ChangeMessageVisibility",
      "sqs:DeleteMessage",
      "sqs:GetQueueAttributes",
      "sqs:ReceiveMessage",
    ]
  }
}

resource "aws_iam_role_policy" "lambda_sqs_policy" {
  count  = var.sqs_event_enabled ? 1 : 0
  name   = "${var.environment}-${var.lambda_name}-lambda-sqs-policy"
  role   = aws_iam_role.lambda_execution_role.name
  policy = data.aws_iam_policy_document.lambda_sqs_policy.json
}

resource "aws_lambda_event_source_mapping" "sqs_event_source_mapping" {
  count                              = var.sqs_event_enabled ? 1 : 0
  batch_size                         = var.event_source_mapping_batch_size
  maximum_batching_window_in_seconds = var.event_source_mapping_batch_window
  event_source_arn                   = local.event_source_mapping_arn["sqs"]
  enabled                            = var.sqs_event_enabled
  function_name                      = aws_lambda_function.function.arn
  function_response_types            = var.event_source_mapping_response_types
}

