resource "aws_sns_topic" "notification" {
  name              = "${local.name_prefix}-notification"
  display_name      = "${local.name_prefix} DAPD notification"
  kms_master_key_id = data.aws_kms_key.custom_default_sns_key.id

  sqs_success_feedback_role_arn = aws_iam_role.sns_logging_role.arn
  sqs_failure_feedback_role_arn = aws_iam_role.sns_logging_role.arn

  tags = merge(
    local.common_tags,
    {
      project                  = "DAPD",
      service                  = "SNS",
      plat_env_project_service = "${local.aggregated_tag}_DAPD_SNS"
    }
  )
}

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

# Allow cross-account subscription
data "aws_iam_policy_document" "notification" {
  statement {
    actions = [
      "sns:AddPermission",
      "sns:DeleteTopic",
      "sns:GetDataProtectionPolicy",
      "sns:GetTopicAttributes",
      "sns:ListSubscriptionsByTopic",
      "sns:Publish",
      "sns:PutDataProtectionPolicy",
      "sns:RemovePermission",
      "sns:SetTopicAttributes",
      "sns:Subscribe",
    ]

    condition {
      test     = "StringEquals"
      variable = "AWS:SourceOwner"

      values = [
        module.aws_accounts_list.accounts["gdb-delphi-dev"],
      ]
    }

    effect = "Allow"

    principals {
      type        = "AWS"
      identifiers = ["*"]
    }

    resources = [aws_sns_topic.notification.arn]

    sid = "__default_statement_ID"
  }

  statement {
    actions = [
      "SNS:Subscribe",
      "SNS:Receive",
    ]

    condition {
      test     = "StringLike"
      variable = "sns:Endpoint"

      values = [
        "arn:aws:sqs:us-east-1:${module.aws_accounts_list.accounts["gdb-apollo-dev"]}:dev-apollo-delphi-notification",
        "arn:aws:sqs:us-east-1:${module.aws_accounts_list.accounts["gdb-apollo-dev"]}:dev-apollo-delphi-notification-stage",
      ]
    }

    effect = "Allow"

    principals {
      type        = "AWS"
      identifiers = ["*"]
    }

    resources = [aws_sns_topic.notification.arn]

    sid = "__console_sub_0"
  }
}

resource "aws_iam_role" "sns_logging_role" {
  name = "${local.name_prefix}-sns-logging"

  assume_role_policy = <<POLICY
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": "sns.amazonaws.com"
      },
      "Effect": "Allow",
      "Sid": ""
    }
  ]
}
POLICY
  tags               = local.common_tags
}

resource "aws_iam_role_policy_attachment" "sns_logging_role" {
  role       = aws_iam_role.sns_logging_role.id
  policy_arn = data.aws_iam_policy.logging.arn
}
