#!/usr/bin/env ruby
require 'optparse'
require 'json'
require 'burlesque'

BANNER = <<-EOL
Burlesque Ruby client v.#{Burlesque::VERSION}

Usage:
    Publish:
        $ bsq pub urgent "Process this message as soon as possible!"
        or
        $ cat urgent-183.txt | bsq pub urgent
    Subscribe:
        $ bsq sub urgent > urgent-184.txt
    Status:
        $ bsq status
    Debug:
        $ bsq debug

Options:
EOL

def error msg = nil
  unless msg.nil?
    puts "\033[31mError: #{msg}\e[0m\n\n"
  end

  puts $options.help
  exit(1)
end

Burlesque.configure

$options = OptionParser.new do |opts|
  opts.banner = BANNER

  opts.on('-h', '--host [HOST]', 'Burlesque host') do |val|
    Burlesque.config.host = val
  end

  opts.on('-p', '--port [PORT]', Integer, 'Burlesque port') do |val|
    Burlesque.config.port = val
  end

  opts.on('-t', '--timeout [TIMEOUT]', Integer, 'Subscription timeout') do |val|
    Burlesque.config.timeout = val
  end

  opts.on('-v', '--version', 'Display Burlesque Ruby client version') do
    puts Burlesque::VERSION
    exit(0)
  end

  opts.on('--help', 'Display this help message') do
    puts $options.help
    exit(0)
  end
end

begin
  $options.parse!
rescue OptionParser::InvalidOption => e
  error(e.message)
end

client = Burlesque::Client.new

case ARGV[0]
when 'pub'
  queue, msg = nil, nil

  case ARGV.length
  when 3
    queue = ARGV[1]
    msg = ARGV[2]
  when 2
    queue = ARGV[1]
    msg = STDIN.read
  else
    error
  end

  ok = client.publish(queue, msg)
  exit(ok ? 0 : 1)
when 'sub'
  queue = nil

  if ARGV.length == 2
    queue = ARGV[1]
  else
    error
  end

  res = client.subscribe(queue)
  if res.nil?
    exit(1)
  else
    puts res[:message]
  end
when 'status'
  puts JSON.pretty_generate(client.status)
when 'debug'
  puts JSON.pretty_generate(client.status)
else
  error
end
