require 'logger'

# Configure the api
#
# === Available settings
#
# * [+debug+] Prints debugging information to logger. Default +false+. Errors still will be logged
# * [+logger+] Configure the logger; set this if you want to use a custom logger.
# * [+request_with+] Sets the desired library to perform requests. Default is +Typhoeus+
#
# === Usage
#
#   Embedly.configure do |config|
#     # prints debug messages
#     config.debug = true
#
#     # customize the logger
#     config.logger = MyAwesomeLogger.new(STDERR)
#
#     # performs requests with net/http
#     config.request_with :net_http
#   end
#
class Embedly::Configuration
  attr_accessor :key, :requester # :nodoc:

  def initialize # :nodoc:
    self.reset
  end

  def debug? # :nodoc:
    self.logger.debug?
  end

  def debug=(true_or_false) # :nodoc:
    set_logger_level(true_or_false)
  end

  def logger # :nodoc:
    @logger ||= default_logger
  end

  def logger=(log) # :nodoc:
    @logger = log
    set_logger_level(self.debug?)
  end

  # Configures a new requester
  #
  # To add a new requester class, you can do the following:
  #
  #    Embedly.configuration.add_requester :custom do |api|
  #      MyRequester.new(api)
  #    end
  #
  # The requester class should respond to +get+ method, which performs the request
  # for more details, see +embedly/request/base.rb+
  def add_requester(name, &block)
    requesters[name] = block
  end

  def requesters # :nodoc:
    @requesters ||= {}
  end

  # Sets api to use the desired requester class
  #
  # When configuring the API, you can do the following:
  #
  #    Embedly.configure do |config|
  #      config.request_with :net_http
  #    end
  #
  # This way, the API will use the +net_http+ class to perform requests
  def request_with(adapter_name)
    self.requester = adapter_name
  end

  # Returns the current configured request block
  def current_requester
    requesters[requester]
  end

  # reset configuration
  def reset
    self.logger   = default_logger
    self.debug    = false
    self.request_with :net_http
  end

  private

  def default_logger # :nodoc:
    Logger.new(STDERR)
  end

  def set_logger_level(true_or_false) # :nodoc:
    logger.level = true_or_false ? Logger::DEBUG : Logger::ERROR
  end
end

# Use typhoeus by default if it is installed
begin
  require "typhoeus"
  Embedly.configuration.request_with :typhoeus
rescue LoadError
  Embedly.configuration.request_with :net_http
end