require 'pinch_hitter/core_ext/string'
require 'pinch_hitter/core_ext/nil_class'
require_relative 'message_queue'

module PinchHitter::Service
  class EndpointHandlers
    def handlers
      @handlers ||= {}
    end

    def store_message(endpoint, message)
      handler = handler_for(endpoint)
      handler.store(message.squish) if handler.respond_to? :store
    end

    def respond_to(endpoint='/', body=nil, request=nil, response = nil)
      handler = handler_for(endpoint)
      if handler.respond_to?(:handle_request)
        handler.handle_request(request, response)
      else
        handler.respond_to(body).squish
      end
    end

    def handler_for(endpoint='/')
      handlers[endpoint] || store_handler(endpoint)
    end

    def handler_for?(endpoint)
      handlers.has_key?(endpoint)
    end

    def register_module(endpoint, mod)
      handler = Object.new
      handler.extend(mod)
      store_handler(endpoint, handler)
    end

    def store_handler(endpoint, handler=MessageQueue.new)
      handlers[endpoint] = handler
    end

    def reset
      handlers.values.each do |handler|
        handler.reset if handler.respond_to? :reset
      end
    end
  end
end