resource "aws_cloudwatch_metric_alarm" "lambda_error_rate" {
  for_each = toset(var.lambda_functions)

  alarm_name          = "lambda-${each.value}-error-rate"
  comparison_operator = "GreaterThanThreshold"
  evaluation_periods  = 1
  threshold           = 5
  alarm_description   = "Alarm when Lambda function ${each.value} has more than 5% error rate in 5 minutes"
  treat_missing_data  = "notBreaching"

  metric_query {
    id          = "error_rate"
    expression  = "IF(invocations > 0, (errors / invocations) * 100, 0)"
    label       = "Error Rate (%)"
    return_data = true
  }

  metric_query {
    id = "errors"

    metric {
      metric_name = "Errors"
      namespace   = "AWS/Lambda"
      period      = 300
      stat        = "Sum"

      dimensions = {
        FunctionName = each.value
      }
    }
  }

  metric_query {
    id = "invocations"

    metric {
      metric_name = "Invocations"
      namespace   = "AWS/Lambda"
      period      = 300
      stat        = "Sum"

      dimensions = {
        FunctionName = each.value
      }
    }
  }

  alarm_actions = [aws_sns_topic.lambda_error_alerts.arn]
  ok_actions    = [aws_sns_topic.lambda_error_alerts.arn]

  tags = merge(var.common_tags, {
    Name = "lambda-${each.value}-error-rate"
  })
}

resource "aws_cloudwatch_metric_alarm" "lambda_error_rate_cloudops_only" {
  for_each = toset(var.lambda_functions_cloudops_only)

  alarm_name          = "lambda-${each.value}-error-rate"
  comparison_operator = "GreaterThanThreshold"
  evaluation_periods  = 1
  threshold           = 5
  alarm_description   = "Alarm when Lambda function ${each.value} has more than 5% error rate in 5 minutes"
  treat_missing_data  = "notBreaching"

  metric_query {
    id          = "error_rate"
    expression  = "IF(invocations > 0, (errors / invocations) * 100, 0)"
    label       = "Error Rate (%)"
    return_data = true
  }

  metric_query {
    id = "errors"

    metric {
      metric_name = "Errors"
      namespace   = "AWS/Lambda"
      period      = 300
      stat        = "Sum"

      dimensions = {
        FunctionName = each.value
      }
    }
  }

  metric_query {
    id = "invocations"

    metric {
      metric_name = "Invocations"
      namespace   = "AWS/Lambda"
      period      = 300
      stat        = "Sum"

      dimensions = {
        FunctionName = each.value
      }
    }
  }

  alarm_actions = [aws_sns_topic.lambda_error_alerts_cloudops_only.arn]
  ok_actions    = [aws_sns_topic.lambda_error_alerts_cloudops_only.arn]

  tags = merge(var.common_tags, {
    Name = "lambda-${each.value}-error-rate"
  })
}
