#!/usr/bin/env ruby

require 'bunny'
require 'logger'
require 'yaml'

$0 = 'onapp_mq_tracer'

module OnApp
  module Utilities
    module MQ
      module Tracer
        extend self

        EXCHANGE_NAME = "amq.rabbitmq.trace".freeze
        CONFIG_FILE   = "/onapp/utilities/mq-tracer/config.yml".freeze
        LOG_FILE      = "/onapp/utilities/mq-tracer/trace.log".freeze

        def perform
          ## Consumes messages from debug queue
          connection = Bunny.new(host: config['rabbitmq_host'],
                                vhost: config['rabbitmq_vhost'],
                                 user: config['rabbitmq_login'],
                                 pass: config['rabbitmq_password'])
          connection.start

          channel  = connection.create_channel
          exchange = channel.topic(EXCHANGE_NAME, durable: true,
                                              auto_delete: false,
                                                 internal: true)
          queue    = channel.queue(durable: false, auto_delete: true)
          queue.bind(exchange, routing_key: '#')

          # If service stopped
          trap :TERM do
            channel.close
            connection.close
          end

          logger = Logger.new(LOG_FILE)

          ## Subscribe for all messages form trace
          queue.subscribe(block: true) do |delivery_info, properties, body|
            ## Logs info into given or some default file
            logger.debug("BODY: #{body} || DELIVERY_INFO: #{delivery_info} || PROPERTIES: #{properties}")
          end
        end

        def config
          raise "Config file doesn't exists!" unless File.exists?(CONFIG_FILE)

          raise "Config file doesn't readable" unless File.readable?(CONFIG_FILE)

          YAML.load_file(CONFIG_FILE)
        end
      end
    end
  end
end

OnApp::Utilities::MQ::Tracer.perform
