# Add Cloudwatch events, based on value of ${var.cloudwatch_event_enabled}

resource "aws_cloudwatch_event_rule" "lambda_run_schedule" {
  count = var.cloudwatch_event_enabled ? length(local.cloudwatch_event_rules) : 0

  name                = "${var.environment}-${local.cloudwatch_event_rules[count.index]["name"]}"
  schedule_expression = local.cloudwatch_event_rules[count.index]["schedule"]
  description         = lookup(local.cloudwatch_event_rules[count.index], "description", "Run ${var.environment}-${var.lambda_name} according to schedule")

  tags = local.combined_resource_tags
}

resource "aws_cloudwatch_event_target" "lambda_event_target" {
  count = var.cloudwatch_event_enabled ? length(local.cloudwatch_event_rules) : 0

  rule      = aws_cloudwatch_event_rule.lambda_run_schedule[count.index].name
  target_id = "${var.environment}_${local.cloudwatch_event_rules[count.index]["name"]}_event_target"
  arn       = aws_lambda_function.function.arn
  input     = lookup(local.cloudwatch_event_rules[count.index], "input", null)
}

resource "aws_lambda_permission" "allow_cloudwatch_to_call_lambda" {
  count = var.cloudwatch_event_enabled ? length(local.cloudwatch_event_rules) : 0

  statement_id  = "AllowExecutionFromCloudWatch${count.index == 0 ? "" : count.index}"
  action        = "lambda:InvokeFunction"
  function_name = aws_lambda_function.function.function_name
  principal     = "events.amazonaws.com"
  source_arn    = aws_cloudwatch_event_rule.lambda_run_schedule[count.index].arn
}
