require 'active_support'
require 'active_support/inflector'
require 'active_support/core_ext'
#require 'active_support/core_ext/hash'
#require 'active_support/core_ext/object'
#require 'active_support/core_ext/class/attribute_accessors'
#require 'active_support/core_ext/class/inheritable_attributes'
require 'api_resource/core_extensions'

require 'active_model'

require 'log4r'
require 'log4r/outputter/consoleoutputters'

require 'api_resource/exceptions'

require 'differ'
require 'colorize'

module ApiResource
  
  extend ActiveSupport::Autoload
  
  autoload :Associations
  autoload :AssociationActivation
  autoload :Attributes
  autoload :Base
  autoload :Callbacks
  autoload :Connection
  autoload :CustomMethods
  autoload :Formats
  autoload :Local
  autoload :LogSubscriber
  autoload :Mocks
  autoload :ModelErrors
  autoload :Observing
  autoload :Scopes
  autoload :Validations
  
  require 'api_resource/railtie'
  
  mattr_writer :logger
  mattr_accessor :raise_missing_definition_error; self.raise_missing_definition_error = false

  DEFAULT_TIMEOUT = 10 # seconds
  
  # Load a fix for inflections for words ending in ess
  ActiveSupport::Inflector.inflections do |inflect|
    inflect.singular(/ess$/i, 'ess')
  end
  
  def self.load_mocks_and_factories
    require 'hash_dealer'
    Mocks.clear_endpoints
    Mocks.init
    
    Dir["#{File.dirname(__FILE__)}/../spec/support/requests/*.rb"].each {|f| 
      require f
    }
    Dir["#{File.dirname(__FILE__)}/../spec/support/**/*.rb"].each {|f| 
      require f
    }
  end

  class << self
    
    delegate :site, :site=, :format, :format=, 
      :token, :token=, :timeout, 
      :open_timeout, 
      :reset_connection, :ttl, :ttl=,
      :to => ApiResource::Base
    
  end

  def self.cache(reset = false)
    @cache = nil if reset
    @cache ||= begin
      defined?(Rails) ? Rails.cache : ActiveSupport::Cache::MemoryStore.new
    end
  end
  
  # set the timeout val and reset the connection
  def self.timeout=(val)
    ApiResource::Base.timeout = val
    self.reset_connection
    val
  end

  # set the timeout val and reset the connection
  def self.open_timeout=(val)
    ApiResource::Base.open_timeout = val
    self.reset_connection
    val
  end
  self.timeout = self.open_timeout = DEFAULT_TIMEOUT

  # Run a block with a given token - useful for AroundFilters
  def self.with_token(new_token, &block)
    old_token = self.token
    begin
      self.token = new_token
      yield
    ensure
      self.token = old_token
    end
  end

  def self.with_ttl(new_ttl, &block)
    old_ttl = self.ttl
    begin
      self.ttl = new_ttl
      yield
    ensure
      self.ttl = old_ttl
    end
  end
  
  # logger
  def self.logger
    return @logger if @logger
    @logger = Log4r::Logger.new("api_resource")
    @logger.outputters = [Log4r::StdoutOutputter.new('console')]
    @logger.level = Log4r::INFO
    @logger
  end
  
  # Use this method to enable logging in the future
  # def self.logging(val = nil)
  #   return (@@logging || false) unless val
  #   return @@logging = val
  # end
  
end