#!/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 PopCommand < AmqpUtils::Command
  def prepare_options(options)
    options.banner <<-BANNER.unindent
    Pops a single message from the queue.
    
       #{command_name} <queue>
    
    Pop 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 a queue name" unless args[0] && !args[0].empty?

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

  def execute
    @queue = args[0]

    mq = MQ.new
    mq.queue(@queue, :passive => true).pop do |header, message|
      if message
        puts "(#{@queue})" unless options[:quiet]
        deserialized_message = AmqpUtils::Serialization.deserialize(header.properties[:content_type], message)
        @formatter.generate(STDOUT, header, deserialized_message)
      else
        puts "(#{@queue}) empty"
      end

      AMQP.stop { EM.stop }
    end
  end
end

PopCommand.run
