#!/usr/bin/env ruby

require File.dirname(__FILE__) + '/../lib/amqp_utils/command'
require File.dirname(__FILE__) + '/../lib/amqp_utils/message_formatter'

class DequeueCommand < AmqpUtils::Command
  def prepare_options(options)
    options.banner %Q{
    |Removes messages from the supplied queues and displays them on STDOUT.
    |
    |  #{command_name} <queue> [<another queue> ...]
    |
    |Dequeue options:
    }.margin
    options.opt :format, 'The format that the messages should be displayed as',
      :short => :none, :default => 'pretty'
    options.opt :quiet, 'Suppresses non-message content output',
      :short => 'q', :default => false
  end

  def validate
    Trollop::die "need at least one queue name" if args.empty?

    @formatter = AmqpUtils::MessageFormatter.for_type(options[:format])
    Trollop::die :format, "not an available type: #{AmqpUtils::MessageFormatter.types.join(", ")}" unless @formatter
  end

  def execute
    @queues = args

    @queues.each do |queue|
      puts "Dequeueing from #{queue} (^C to stop)..." unless options[:quiet]
      mq = MQ.new

      process_message = lambda do |header, message|
        puts "(#{queue})" unless options[:quiet]
        @formatter.generate(STDOUT, header, message)
      end
      mq.queue(queue, :passive => true).subscribe(&process_message)
    end
  end
end

DequeueCommand.run
