#!/usr/bin/env ruby

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

class DequeueCommand < AmqpUtils::Command
  def prepare_options(options)
    options.banner <<-BANNER.unindent
    Removes messages from the supplied queues and displays them on STDOUT.
    
      #{command_name} <queue> [<another queue> ...]
    
    Dequeue options:
    BANNER
    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]
        deserialized_message = AmqpUtils::Serialization.deserialize(header.properties[:content_type], message)
        @formatter.generate(STDOUT, header, deserialized_message)
      end
      mq.queue(queue, :passive => true).subscribe(&process_message)
    end
  end
end

DequeueCommand.run
