#!/usr/bin/env ruby

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

class EnqueueCommand < AmqpUtils::Command
  def prepare_options(options)
    options.banner %Q{
    |Publishes a message to a particular queue.
    |
    |  #{command_name} <queue>
    |
    |Enqueue options:
    }.margin
    options.opt :persistent, 'Mark messages as persistent.', :short => :none
    options.opt :priority, 'The priority of this message', :type => :int, :short => :none, :default => 1
    options.opt :count, 'Number of times the message should be published.', :type => :int, :default => 1
    options.opt :header, 'A key-value pair to be set in "headers" field of the AMQP header', :short => :none, :type => :string, :multi => true
    options.opt :message, 'The message to publish to the queue. Comes from STDIN if not provided.', :type => :string, :default => nil
  end

  def validate
    if options[:header]
      options[:header] = Hash[*(options[:header].map do |h|
        h.split('=')
      end.flatten)]
    end
    Trollop::die "need a queue to publish to" unless args[0] && !args[0].empty?
  end

  def execute
    @queue = args
    @message = options[:message] || STDIN.read

    publisher = EM.spawn do |queue, message, messages, options|
      @progress ||= Clio::Progressbar.new('Enqueuing', options[:count])

      if messages > 0
        @mq ||= MQ.new
        headers = options[:header]
        @mq.queue(queue, :durable => true, :auto_delete => false).
          publish(message, :persistent => options.persistent, :headers => headers, :priority => options.priority)

        @progress.inc
        publisher.notify(queue, message, messages - 1, options)
      else
        @progress.finish
        EM.next_tick { AMQP.stop { EM.stop } }
      end
    end

    publisher.notify(@queue, @message, options[:count], options)
  end
end

EnqueueCommand.run
