resource "aws_sqs_queue" "this_dlq" {
  name                              = "${var.name}-DLQ"
  tags                              = var.tags
  kms_master_key_id                 = var.sqs_kms_master_key_id
  kms_data_key_reuse_period_seconds = local.sqs_kms_data_key_reuse_period_seconds
}

locals {
  sqs_kms_data_key_reuse_period_seconds = var.sqs_kms_data_key_reuse_period_seconds == null ? 300 : var.sqs_kms_data_key_reuse_period_seconds
  sqs_kms_arn                           = var.sqs_kms_master_key_id != null ? "arn:aws:kms:${data.aws_region.current.region}:${data.aws_caller_identity.current.account_id}:key/${var.sqs_kms_master_key_id}" : null
}

data "aws_caller_identity" "current" {}
data "aws_region" "current" {}

resource "aws_sqs_queue" "this" {
  name                              = var.name
  visibility_timeout_seconds        = var.visibility_timeout_seconds
  message_retention_seconds         = var.message_retention_seconds
  receive_wait_time_seconds         = var.receive_wait_time_seconds
  tags                              = var.tags
  kms_master_key_id                 = var.sqs_kms_master_key_id
  kms_data_key_reuse_period_seconds = local.sqs_kms_data_key_reuse_period_seconds

  redrive_policy = <<POLICY
{
  "deadLetterTargetArn":"${aws_sqs_queue.this_dlq.arn}",
  "maxReceiveCount":5
}
POLICY
}

resource "aws_sns_topic" "this" {
  name              = var.name
  kms_master_key_id = var.sns_kms_master_key_id
}

resource "aws_sns_topic_policy" "this" {
  arn    = aws_sns_topic.this.arn
  policy = data.aws_iam_policy_document.sns.json
}

data "aws_iam_policy_document" "sns" {
  version   = "2012-10-17"
  policy_id = var.name

  statement {
    actions = [
      "SNS:Publish"
    ]
    condition {
      test     = "ArnLike"
      variable = "aws:SourceArn"

      values = [
        "arn:aws:s3:::${var.s3_logs_bucket_name}"
      ]
    }
    effect = "Allow"
    principals {
      type        = "AWS"
      identifiers = ["*"]
    }
    resources = [
      aws_sns_topic.this.arn,
    ]
    sid = var.name
  }
}

resource "aws_sns_topic_subscription" "this" {
  topic_arn = aws_sns_topic.this.arn
  protocol  = "sqs"
  endpoint  = aws_sqs_queue.this.arn
}


data "aws_iam_policy_document" "sqs" {
  version = "2012-10-17"

  statement {
    actions = [
      "sqs:SendMessage"
    ]
    condition {
      test     = "ArnLike"
      variable = "aws:SourceArn"
      values = [
        aws_sns_topic.this.arn,
        "${aws_sns_topic.this.arn}:*",
        "arn:aws:s3:::${var.s3_logs_bucket_name}"
      ]
    }
    effect = "Allow"
    principals {
      type        = "AWS"
      identifiers = ["*"]
    }
    resources = [
      aws_sqs_queue.this.arn,
    ]
    sid = var.name
  }
}

resource "aws_sqs_queue_policy" "this" {
  queue_url = aws_sqs_queue.this.id
  policy    = data.aws_iam_policy_document.sqs.json
}
