###################################
## Outbox Processor Lambda & Schedule
###################################

# Reference the outbox-process lambda from lambda-abacus module
data "terraform_remote_state" "lambda_abacus" {
  backend = "local"

  config = {
    path = "${path.module}/../lambda-abacus/terraform.tfstate"
  }
}

# IAM policy for EventBridge (attach to existing lambda role)
resource "aws_iam_role_policy" "outbox_process_eventbridge" {
  name = "${var.environment}-outbox-process-eventbridge"
  role = data.terraform_remote_state.lambda_abacus.outputs.outbox_process_role_name

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect = "Allow"
        Action = [
          "events:PutEvents"
        ]
        Resource = "arn:aws:events:${var.aws_region}:*:event-bus/default"
      }
    ]
  })
}

# EventBridge rule to trigger outbox processor (every minute)
# Note: AWS EventBridge rate() expressions don't support seconds - minimum is 1 minute
resource "aws_cloudwatch_event_rule" "outbox_process_schedule" {
  name                = "${var.environment}-outbox-process-schedule"
  description         = "Trigger outbox processor every minute"
  schedule_expression = "rate(1 minute)"

  tags = local.common_tags
}

# EventBridge target to invoke Lambda
resource "aws_cloudwatch_event_target" "outbox_process_target" {
  rule      = aws_cloudwatch_event_rule.outbox_process_schedule.name
  target_id = "OutboxProcessorLambda"
  arn       = data.terraform_remote_state.lambda_abacus.outputs.outbox_process_function_arn
}

# Permission for EventBridge to invoke Lambda
resource "aws_lambda_permission" "allow_eventbridge_outbox_process" {
  statement_id  = "AllowExecutionFromEventBridge"
  action        = "lambda:InvokeFunction"
  function_name = data.terraform_remote_state.lambda_abacus.outputs.outbox_process_function_name
  principal     = "events.amazonaws.com"
  source_arn    = aws_cloudwatch_event_rule.outbox_process_schedule.arn
}

###################################
## Downstream Event Handlers
###################################

# EventBridge rule to capture file_upload.completed events
resource "aws_cloudwatch_event_rule" "file_upload_completed" {
  name        = "${var.environment}-file-upload-completed"
  description = "Capture file upload completed events from outbox"

  event_pattern = jsonencode({
    source      = ["abacus.outbox"]
    detail-type = ["file_upload.completed"]
  })

  tags = local.common_tags
}

# CloudWatch Logs target for observability (optional)
resource "aws_cloudwatch_log_group" "outbox_events" {
  name              = "/aws/events/${var.environment}-outbox-events"
  retention_in_days = 7

  tags = local.common_tags
}

resource "aws_cloudwatch_event_target" "file_upload_completed_logs" {
  rule      = aws_cloudwatch_event_rule.file_upload_completed.name
  target_id = "LogTarget"
  arn       = aws_cloudwatch_log_group.outbox_events.arn
}
