require 'rubygems'
require 'logger'
require 'eventmachine'
require 'em-hiredis'


module Noah
  class Watcher
    attr_accessor :my_pattern, :my_destination
  
    def self.watch(&blk)
      watcher = Noah::Watcher.new
      watcher.instance_eval(&blk)
      watcher
    end

    def pattern(pattern)
      @my_pattern = pattern
    end

    def destination(destination)
      @my_destination = destination
    end

    def run!
      @my_destination.nil? ? (puts "Can't run without a destination") : run_watcher(@my_destination)
    end

    private
    def run_watcher(dest)
      watcher_log = Logger.new(STDOUT)
      EventMachine.run do
        watcher_log.info("Starting Noah Watcher...")
        watcher_log.info("Filtering on messages: #{@my_pattern}")
        channel = EventMachine::Channel.new

        r = EventMachine::Hiredis::Client.connect
        r.db(5)
        r.psubscribe(@my_pattern)
        r.on(:pmessage) do |pattern, event, message|
          channel.push "#{message}"
        end

        sub = channel.subscribe {|msg| dest.call(msg)}
      end
    end

  end
end