#!/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 PeekCommand < AmqpUtils::Command
  def prepare_options(options)
    options.banner <<-BANNER.unindent
    Displays the head of the queue without removing the message from the queue.
    
      #{command_name} <queue>
    
      NOTE: This operation does have side effects on the server. The message is
            placed at the end of the queue after returning from this method. The
            message is also marked as being redelivered.
    
    Peek 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
    options.opt :num, 'Number of msgs to peek',:short => 'n', :default => 1 
    options.opt :raw, 'Do not deserialize message for display', :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
    queue = mq.queue(@queue, :passive => true)
    options[:num].times do
      queue.pop(:ack => true) do |header, message|
        if message
          puts "(#{@queue})" unless options[:quiet]

          if options[:raw]
            deserialized_message = message
          else
            deserialized_message = AmqpUtils::Serialization.deserialize(header.properties[:content_type], message)
          end

          @formatter.generate(STDOUT, header, deserialized_message)
        else
          puts "(#{@queue}) empty"
        end
      end
    end
    AMQP.stop { EM.stop }
  end
end

PeekCommand.run
