module "lambda_sr_delivery_tiktok_ack_processor_owsrequest" {
  source = "git@github.com:theorchard/terraform-owsrequest.git//?ref=1.1.0"

  environment_name = var.environment
  service_name     = var.sr_delivery_tiktok_ack_processor_name
}

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

  application_family       = var.application_family
  datadog_advanced_enabled = true
  environment              = var.environment
  lambda_name              = var.sr_delivery_tiktok_ack_processor_name
  lambda_description       = "Acknowledge processor for Tiktok Deliveries"
  lambda_function_timeout  = var.lambda_max_timeout
  use_container_image      = true
  vpc_id                   = var.vpc_id
  vpc_subnet_ids           = var.vpc_subnet_ids

  lambda_function_memory_size = 512

  lambda_function_environment_variables = {
    ENVIRONMENT               = var.environment
    SNOWFLAKE_ACCOUNT         = var.snowflake_account
    SNOWFLAKE_USER            = var.sr_ack_snowflake_user
    SNOWFLAKE_DATABASE        = var.snowflake_database
    SNOWFLAKE_SCHEMA          = var.snowflake_schema
    SNOWFLAKE_WAREHOUSE       = var.snowflake_warehouse
    SNOWFLAKE_TABLE           = var.snowflake_delivery_history_table
    SNOWFLAKE_ROLE            = var.snowflake_role
    LOGGER_LEVEL              = "INFO"
    LIMIT                     = "750"
    ACKS_FILTER_AWAITED_HOURS = "2160" // Set to 90 days (2160 hours) to cover the maximum retention period of TikTok logs, which is 90 days. This ensures that the lambda can process all relevant logs without missing any due to the retention policy.
  }

  lambda_function_reserved_concurrent_executions = "1"

  iam_managed_policy_attachments = [
    module.lambda_sr_delivery_tiktok_ack_processor_owsrequest.policy_arn_output,
    aws_iam_policy.sr_delivery_tiktok_secrets_manager_policy.arn,
  ]
}

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

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

data "aws_iam_policy_document" "sr_delivery_tiktok_secrets_manager_policy" {
  statement {
    actions = [
      "secretsmanager:GetSecretValue",
    ]

    resources = [
      "arn:aws:secretsmanager:*:*:secret:${var.environment}/${var.sr_delivery_tiktok_function_name}/",
      "arn:aws:secretsmanager:*:*:secret:${var.environment}/${var.sr_delivery_tiktok_function_name}/*",
    ]
  }
}

locals {
  sr_delivery_tiktok_ack_processor_tags = flatten([
    local.env_tags,
    "service:${var.sr_delivery_tiktok_ack_processor_name}",
    "service_name:${var.sr_delivery_tiktok_ack_processor_name}",
    local.team_tags,
  ])
}

resource "aws_iam_policy" "sr_delivery_tiktok_secrets_manager_policy" {
  name   = "SecretsManager-${var.environment}-${var.sr_delivery_tiktok_function_name}-policy"
  policy = data.aws_iam_policy_document.sr_delivery_tiktok_secrets_manager_policy.json
}

resource "datadog_monitor" "lambda_sr_delivery_tiktok_ingestion_error_rate" {
  name               = "${var.environment}-sr-tiktok-ingestion-error-rate"
  type               = "metric alert"
  message            = "{{#is_alert}} Critical: High percentage of TikTok ack error messages received in the last hour. {{/is_alert}}{{#is_warning}} Warning: Elevated percentage of ack error messages received in the last hour in the TikTok ack processor. {{/is_warning}}{{#is_recovery}} Resolved: Percentage of ack error messages received in the TikTok ack processor is back to normal. {{/is_recovery}} Notify: ${var.notification_endpoints}"

  query              = "max(last_1h):max:snowflake.custom.query_monitor.sound_recording_tiktok_error_ack_messages_percentage{*} >= 20"

  monitor_thresholds {
    warning  = 10
    critical = 20
  }

  notify_no_data        = true
  no_data_timeframe     = 240
  notify_audit          = false
  renotify_interval     = 30
  timeout_h             = 0
  require_full_window   = false

  tags = local.sr_delivery_tiktok_ack_processor_tags
}

module "datadog_lambda_sr_delivery_tiktok_ack_processor_dashboards" {
  source                                = "git@github.com:theorchard/terraform-datadog.git//modules/lambda?ref=6.18.1"
  service_name                          = var.sr_delivery_tiktok_ack_processor_name
  environment                           = var.environment
  lambda_invocation_monitor_enabled     = false
  lambda_error_monitor_enabled          = true
  lambda_error_critical_number          = 5
  lambda_error_critical_recovery_number = 3
  lambda_error_warning_number           = 2
  lambda_error_warning_recovery_number  = null
  notification_endpoints                = var.notification_endpoints
  teams                                 = var.teams
}

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

  environment                    = var.environment
  service_name                   = var.sr_delivery_tiktok_ack_processor_name
  secret_name                    = each.value
  application_family             = var.application_family
  secret_recovery_window_in_days = 7
}

moved {
  from = module.snowflake_secret
  to   = module.secrets["SNOWFLAKE_KEY"]
}
