module Capcode
  class << self
    def set(key, value, opts = {}); Configuration.set(key, value, opts); end
  end
  
  class Configuration
    class << self
      def configuration( args = {} ) #:nodoc:
        @configuration = config.merge({
          :port => args[:port]||Capcode::Configuration.get(:port)||3000, 
          :host => args[:host]||Capcode::Configuration.get(:host)||"0.0.0.0",
          :server => args[:server]||Capcode::Configuration.get(:server)||nil,
          :log => args[:log]||Capcode::Configuration.get(:log)||$stdout,
          :session => args[:session]||Capcode::Configuration.get(:session)||{},
          :pid => args[:pid]||Capcode::Configuration.get(:pid)||"#{$0}.pid",
          :daemonize => args[:daemonize]||Capcode::Configuration.get(:daemonize)||false,
          :db_config => File.expand_path(args[:db_config]||Capcode::Configuration.get(:db_config)||"database.yml"),
          :root => args[:root]||Capcode::Configuration.get(:root)||File.expand_path(File.dirname($0)),
          :static => args[:static]||Capcode::Configuration.get(:static)||args[:root]||File.expand_path(File.dirname($0)),
          :verbose => args[:verbose]||Capcode::Configuration.get(:verbose)||false,
          :console => false
        })
      end
      def config #:nodoc:
        @configuration ||= {}
      end
      
      def print_debug
        Capcode::Configuration.config.each do |k, v|
          puts "** [CONFIG] : #{k} = #{v}"
        end
      end
      
      # Set global configuration options
      #
      # Options :
      # * <tt>:port</tt> = Listen port (default: 3000)
      # * <tt>:host</tt> = Listen host (default: 0.0.0.0)
      # * <tt>:server</tt> = Server type (webrick, mongrel or thin)
      # * <tt>:log</tt> = Output logfile (default: STDOUT)
      # * <tt>:session</tt> = Session parameters. See Rack::Session for more informations
      # * <tt>:pid</tt> = PID file (default: $0.pid)
      # * <tt>:daemonize</tt> = Daemonize application (default: false)
      # * <tt>:db_config</tt> = database configuration file (default: database.yml)
      # * <tt>:static</tt> = Static directory (default: the working directory)
      # * <tt>:root</tt> = Root directory (default: directory of the main.rb) -- This is also the working directory !
      # * <tt>:verbose</tt> = run in verbose mode
      # * <tt>:auth</tt> = HTTP Basic Authentication options 
      #
      # It can exist specifics options depending on a renderer, a helper, ...
      # 
      # Example : 
      #
      #   module Capcode
      #     set :erb, "/path/to/erb/files"
      #     ...
      #   end
      def set( key, value, opts = {} )
        if Hash === value
          opts = value
          value = nil
        end
        config[key] = value
        options[key] = opts
      end
      
      def get( key = nil )
        if key.nil?
          config
        else
          config[key] || nil
        end
      end
      
      def options
        @options ||= {}
      end
    end
  end
end