# Preference Center fan subscription updates lambda.

module "lambda_fan_subscription_preference_sforce_updates_sentry_project" {
  source = "git@github.com:theorchard/terraform-sentry.git?ref=5.0.0"

  application_family = var.application_family
  environment        = var.environment
  platform           = "python"
  service_name       = var.lambda_fan_subscription_preference_sforce_updates_sentry_service_name
  teams              = [var.environment]
}

module "lambda_fan_subscription_preference_sforce_updates" {
  source = "git@github.com:theorchard/terraform-lambda.git//?ref=5.2.1"

  application_family       = var.application_family
  datadog_enabled          = true
  datadog_advanced_enabled = true
  environment              = var.environment
  lambda_name              = var.lambda_fan_subscription_preference_sforce_updates_name
  lambda_description       = "Lambda for handling Preference Center fan subscription updates sync into Sforce."
  use_container_image      = true
  vpc_id                   = module.vpc_info.vpc_id
  vpc_subnet_ids           = module.vpc_info.default_private_subnet_ids
  lambda_function_timeout  = 900

  // The lambda will be triggered by MSK events from fan subscription updates topic
  msk_event_enabled                      = true
  event_source_mapping_batch_size        = 10
  event_source_mapping_batch_window      = 300
  kafka_topics                           = [var.fan_subscription_event_updates_topic_name]
  event_source_mapping_msk_cluster_name  = "${var.environment}-${var.msk_cluster_name}"
  event_source_mapping_msk_cluster_uuid  = data.aws_msk_cluster.kafka_fansifter.cluster_uuid
  event_source_mapping_starting_position = "LATEST"
  event_source_mapping_failure_arn       = module.failure_sns_topic.topic_arn

  lambda_function_reserved_concurrent_executions = "3"

  kafka_use_lambda_name_as_consumer_id = true

  datadog_function_destination_lambda_name = "DatadogLambdaFunction"
  iam_managed_policy_attachments = [
    aws_iam_policy.failure_destination_policy.arn
  ]

  lambda_function_environment_variables = {
    SENTRY_DSN               = module.lambda_fan_subscription_preference_sforce_updates_sentry_project.sentry_key_dsn_public_output
    ENVIRONMENT              = var.environment
    KAFKA_TARGET_TOPIC       = var.fan_subscription_sforce_sink_topic_name
    KAFKA_BOOTSTRAP_SERVERS  = data.aws_msk_cluster.kafka_fansifter.bootstrap_brokers_tls
    KAFKA_SECURITY_PROTOCOL  = "SSL"
    KAFKA_MESSAGE_HEADER_KEY = "CamelHeader.sObjectIdValue"
    SNOWFLAKE_ACCOUNT        = "SME-DELPHI"
    SNOWFLAKE_USER           = "${upper(var.environment)}_LAMBDA_FAN_SUBSCRIPTION_PREFERENCE_SFORCE_UPDATES"
    SNOWFLAKE_DATABASE       = "PREFERENCE_CENTER"
    SNOWFLAKE_SCHEMA         = upper(var.environment)
    SNOWFLAKE_WAREHOUSE      = "${upper(var.environment)}_ETL_WH"
    SNOWFLAKE_ROLE           = "${upper(var.environment)}_LAMBDA_FAN_SUBSCRIPTION_PREFERENCE_SFORCE_UPDATES"
    KAFKA_DLQ_TOPIC          = var.fan_subscription_dlq_topic_name
  }
}

module "snowflake_sink_lambda_fan_subscription_preference_sforce_updates" {
  source   = "git@github.com:theorchard/terraform-secrets-manager.git//?ref=1.5.1"
  for_each = toset(var.snowflake_creds_secret_names)

  environment        = var.environment
  application_family = var.application_family
  service_name       = var.lambda_fan_subscription_preference_sforce_updates_name
  secret_name        = each.value
}

module "lambda_fan_subscription_preference_sforce_updates_datadog_monitoring" {
  source = "git@github.com:theorchard/terraform-datadog.git//modules/lambda?ref=6.15.2"

  environment  = var.environment
  service_name = var.lambda_fan_subscription_preference_sforce_updates_name
  teams        = ["kdh", "fansifter"]

  notification_endpoints = var.notification_endpoints
}

# alert if there are more than 2 messages in DLQ topic in last 15 minutes.
resource "datadog_monitor" "lambda_errors_monitor" {
  count   = 1
  name    = "${var.environment}-${var.lambda_fan_subscription_preference_sforce_updates_sentry_service_name}-DLQ-monitor"
  type    = "metric alert"
  message = "[${var.environment}] ${var.lambda_fan_subscription_preference_sforce_updates_sentry_service_name} sent a message into DLQ topic. Notify: ${var.notification_endpoints}"

  query = "max(last_15m):avg:aws.kafka.messages_in_per_sec{cluster_name:${data.aws_msk_cluster.kafka_fansifter.cluster_name},topic:${lower(var.fan_subscription_dlq_topic_name)}} >= 1"

  monitor_thresholds {
    ok       = 0
    critical = 1
  }

  notify_no_data      = false
  notify_audit        = false
  renotify_interval   = 60
  timeout_h           = 1
  require_full_window = false
  renotify_statuses   = ["alert"]

}
