# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0

# Purpose
# This code example demonstrates how to create a dead-letter queue, get and set some queue attributes,
# send a message to the queue, wait (poll) for the message to arrive, and receive the message.

# snippet-start:[ruby.example_code.sqs.ScenarioDeadLetterQueue]

require 'aws-sdk-sqs' # v2: require 'aws-sdk'

# Uncomment for Windows.
# Aws.use_bundled_cert!
# Replace us-west-2 with the AWS Region you're using for Amazon SQS.
sqs = Aws::SQS::Client.new(region: 'us-west-2')

# Create a queue representing a dead-letter queue.
dead_letter_queue_name = 'dead-letter-queue'

sqs.create_queue({
                   queue_name: dead_letter_queue_name
                 })

# Get the dead letter queue's URL and ARN, so that you can associate it with an existing queue.
dead_letter_queue_url = sqs.get_queue_url(queue_name: dead_letter_queue_name).queue_url

dead_letter_queue_arn = sqs.get_queue_attributes({
                                                   queue_url: dead_letter_queue_url,
                                                   attribute_names: ['QueueArn']
                                                 }).attributes['QueueArn']

# Associate the dead letter queue with an existing queue.
begin
  queue_name = 'my-queue'
  queue_url = sqs.get_queue_url(queue_name: queue_name).queue_url

  # Use a redrive policy to specify the dead letter queue and its behavior.
  redrive_policy = {
    'maxReceiveCount' => '5', # After the queue receives the same message 5 times,
    'deadLetterTargetArn' => dead_letter_queue_arn # send that message to the dead letter queue.
  }.to_json

  sqs.set_queue_attributes({
                             queue_url: queue_url,
                             attributes: {
                               'RedrivePolicy' => redrive_policy
                             }
                           })
rescue Aws::SQS::Errors::NonExistentQueue
  puts "A queue named '#{queue_name}' does not exist."
  exit(false)
end

# Send a message to the queue.
puts 'Sending a message...'

sqs.send_message({
                   queue_url: queue_url,
                   message_body: 'I hope I get moved to the dead letter queue.'
                 })

30.downto(0) do |i|
  print "\rWaiting #{i} second(s) for sent message to be receivable..."
  sleep(1)
end

puts "\n"

poller = Aws::SQS::QueuePoller.new(queue_url)
# Receive 5 messages max and stop polling after 20 seconds of no received messages.
poller.poll(max_number_of_messages: 5, idle_timeout: 20) do |messages|
  messages.each do |msg|
    puts "Received message ID: #{msg.message_id}"
  end
end

# Check to see if Amazon SQS moved the message to the dead letter queue.
receive_message_result = sqs.receive_message({
                                               queue_url: dead_letter_queue_url,
                                               max_number_of_messages: 1
                                             })

if receive_message_result.messages.count.positive?
  puts "\n#{receive_message_result.messages[0].body}"
else
  puts "\nNo messages received."
end
# snippet-end:[ruby.example_code.sqs.ScenarioDeadLetterQueue]
