module "comp_tracker_failure_sns_topic" {
  source = "git@github.com:theorchard/terraform-sns.git//?ref=3.0.0"

  environment               = var.environment
  sns_topic_name            = var.comp_tracker_failure_sns_topic
  application_family        = var.application_family
  sns_subscription_endpoint = var.notification_email
  sns_subscription_protocol = "email"
}


# create SNS Write policy
data "aws_iam_policy_document" "comp_tracker_failure_destination_policy_document" {
  statement {
    effect = "Allow"
    actions = [
      "sns:Publish",
    ]
    resources = [
      module.comp_tracker_failure_sns_topic.topic_arn
    ]
  }
}
resource "aws_iam_policy" "comp_tracker_failure_destination_policy" {
  name        = "${var.environment}-comp-tracker-failure-destination-policy"
  description = "Access comp_tracker_failure_sns_topic from lambda"
  policy      = data.aws_iam_policy_document.comp_tracker_failure_destination_policy_document.json
}

module "lambda-publishing-changelog-composition-tracker" {
  source                      = "git@github.com:theorchard/terraform-lambda.git?ref=3.1.9"
  environment                 = var.environment
  lambda_name                 = var.composition_tracker_lambda_name
  lambda_description          = "Lambda triggered by publishingComposition Kafka topics and writes composition metadata changes to a database"
  lambda_function_timeout     = "900"
  use_container_image         = true
  vpc_subnet_ids              = module.vpc_info.default_private_subnet_ids
  vpc_enabled                 = true
  vpc_id                      = module.vpc_info.vpc_id
  datadog_advanced_enabled    = true
  application_family          = var.application_family
  lambda_function_memory_size = var.lambda_memory_size
  splitio_enabled             = true

  msk_event_enabled                     = true
  event_source_mapping_msk_cluster_name = var.trigger_msk_cluster_name
  event_source_mapping_msk_cluster_uuid = var.trigger_msk_cluster_uuid
  event_source_mapping_batch_size       = 5
  msk_topics = [
    var.pub_composition_topic,
    var.pub_hasSoundRecording_topic
  ]

  event_source_mapping_starting_position = "LATEST"

  // Accepts create & delete operations for hasSoundRecording messages.
  // Accepts  all operations for publishingComposition messages where the composition is not a draft (i.e. after.draft = false; before.draft = false and after = null)
  // or when a draft composition is updated to a submitted composition
  event_source_mapping_filter_criteria_pattern = jsonencode({ "value" : {
    "$or" : [
      { "payload.after.properties.draft" : [false] },
      { "payload.after" : [null], "payload.before.properties.draft" : [false] },
      { "payload.type" : ["relationship"], "meta.operation" : ["created", "deleted"] },
      // In V5 structure.
      { "event.state.after.properties.draft.B" : [false] },
      { "event.state.after" : [null], "event.state.before.properties.draft.B" : [false] },
      { "event.eventType" : ["RELATIONSHIP"], "event.operation" : ["CREATE", "DELETE"] },
    ]
  } })
  iam_managed_policy_attachments = [
    aws_iam_policy.comp_tracker_failure_destination_policy.arn
  ]

  lambda_function_environment_variables = {
    Environment                  = var.environment
    DD_LAMBDA_HANDLER            = "app.handler"
    SENTRY_DSN                   = module.lambda_publishing_changelog_composition_tracker_lambda_name_sentry_project.sentry_key_dsn_public_output
    KAFKAJS_LOG_LEVEL            = "nothing"
    KAFKA_BROKERS                = var.kafka_brokers
    METADATA_CHANGE_TOPIC        = var.pub_metadataChange_topic
    PUBLISHING_COMPOSITION_TOPIC = var.pub_composition_topic
    HAS_SOUND_RECORDING_TOPIC    = var.pub_hasSoundRecording_topic
  }

  lambda_function_reserved_concurrent_executions = 1
}

module "lambda_publishing_changelog_composition_tracker_lambda_name_sentry_project" {
  source                       = "git@github.com:theorchard/terraform-sentry.git//?ref=4.1.2"
  service_name                 = var.composition_tracker_lambda_name
  secrets_manager_service_name = var.composition_tracker_lambda_name
  environment                  = var.environment
  platform                     = "node"
  application_family           = var.application_family
}

module "datadog_lambda_publishing_changelog_composition_tracker_dashboards" {
  source                            = "git@github.com:theorchard/terraform-datadog.git//modules/lambda?ref=6.10.7"
  service_name                      = var.composition_tracker_lambda_name
  environment                       = var.environment
  lambda_invocation_monitor_enabled = false
  lambda_error_monitor_enabled      = true
  notification_endpoints            = var.slack_alert_channel
}

locals {
  # Manually build filters for the offsetLag metric, we want the Consumer Ids for each MSK Source Event
  comp_tracker_consumer_group_ids = join(" OR ", [for c in module.lambda-publishing-changelog-composition-tracker.msk_event_source_mapping_uuid : "consumer_group:${c}"])
}

resource "datadog_monitor" "lambda_composition_tracker_offset_lag_monitor" {
  name               = "${var.environment}-${var.composition_tracker_lambda_name}-offset-lag"
  type               = "metric alert"
  message            = "{{#is_alert}} The Lambda offset lag is too high {{/is_alert}} {{#is_alert_recovery}} Offset lag is recovering {{/is_alert_recovery}} in {{[aws.kafka.sum_offset_lag].topic}} \n Notify: ${var.slack_alert_channel}"
  query              = "avg(last_30m):aws.kafka.sum_offset_lag{environment:${var.environment} AND ${local.comp_tracker_consumer_group_ids}} by {topic} > 200"

  monitor_thresholds {
    critical = 200
    warning  = 175
  }

  notify_no_data = true
  no_data_timeframe = 60
  notify_audit = false
  renotify_interval = 30
  timeout_h = 0
  require_full_window = false
}
