# load configuration information from $HOME/.whimsy

require 'yaml'
require 'etc'

module ASF

  #
  # Support for local (development) configuration overrides to be stored in
  # <tt>.whimsy</tt> files in YAML format.  Allows the specification of where
  # subversion, git, and other files are stored, where updated files are
  # cached, mailing list configuration, and other values.
  #
  # Any .whimsy file in your home directory is processed first.
  #
  # Additionally, a search is made for .whimsy files in the current working
  # directory and then working up the directory path and finally in /srv.
  # If such a .whimsy file is found, it will be processed for
  # overrides to the configuration.
  #
  # The configuration value of :root:, if provided, will establish the default
  # root directory for a number of files/directories (among them, svn, git, and
  # subscriptions).  If the value is '.' and the parent directory for this
  # file contains a `whimsy` subdirectory, then the parent directory will
  # be considered the root.
  #
  class Config
    @home = ENV['HOME'] || Dir.home(Etc.getpwuid.name)

    @config = {}
    if File.exist? "#@home/.whimsy"
      @config.merge! YAML.load_file("#@home/.whimsy") rescue {}
    end

    # Search up the directory path for a .whimsy file containing overrides.
    # Default @root to /srv if no such file is found.
    @root = File.realpath(Dir.pwd)
    @root = loop do
      break '/srv' if @root == @home
      break @root if File.exist? "#@root/.whimsy"
      break '/srv' if @root == '/'

      @root = File.dirname(@root)
    end

    if File.exist? "#@root/.whimsy"
      @config.merge! YAML.load_file("#@root/.whimsy") || {}
      @root = '/srv' unless Dir.exists? "#@root/whimsy"
    end

    # capture root
    if @config[:root] == '.'
      @config[:root] ||= @root
    elsif @config[:root]
      @root = @config[:root]
    else
      @root = '/srv'
    end

    # allow for test overrides
    @testdata = {}

    # default :svn and :git
    @config[:svn] ||= "#@root/svn/*"
    @config[:git] ||= "#@root/git/*"

    # The cache is used for local copies of SVN files that may be updated by Whimsy
    # for example: podlings.xml
    # www/roster/views/actions/ppmc.json.rb (write)
    # lib/whimsy/asf/podlings.rb (read)
    # see: http://mail-archives.apache.org/mod_mbox/whimsical-dev/201705.mbox/%3CCAFG6u8FJwvWvnd29O-cUZyQnCXrRvWSRDc11zaPx6_Y4ihnsfg%40mail.gmail.com%3E
    @config[:cache] ||= "#@root/cache"

    # Contains the data files from the ezmlm mail server, e.g.
    # list-subs - subscriptions
    # list-mods - moderators
    # The above are used by mlist.rb
    # list-flags - flags domain listname
    # The above are used by mail.rb
    @config[:subscriptions] ||= "#@root/subscriptions"

    @config[:lib] ||= []

    # add gems to lib
    (@config[:gem] || {}).to_a.reverse.each do |name, version|
      begin
        gem = Gem::Specification.find_by_name(name, version)
        @config[:lib] += Dir[gem.lib_dirs_glob]
      rescue Gem::LoadError
      end
    end

    # add libraries to RUBYLIB, load path
    (@config[:lib] || []).reverse.each do |lib|
      next unless File.exist? lib
      lib = File.realpath(lib)
      ENV['RUBYLIB']=([lib] + ENV['RUBYLIB'].to_s.split(':')).uniq.join(':')
      $LOAD_PATH.unshift lib.untaint unless $LOAD_PATH.include? lib
    end

    # Look up a configuration value by name (generally a symbol, like
    # <tt>:svn</tt>).
    def self.get(value)
      @config[value]
    end

    # Look up a configuration value by name (generally a symbol, like
    # <tt>:svn</tt>). Allows test overrides
    def self.[](value)
      @testdata[value] || @config[value]
    end

    # Set a local directory corresponding to a path  
    # Useful as a test data override.
    def self.[]=(name, path)
      @testdata[name] = File.expand_path(path).untaint
    end

    def self.root
      @root
    end
    # For testing only!!
    def self.setroot(path)
      @root = path
    end
    # Testing only: override svn config
    # path must end in /*
    def self.setsvnroot(path)
      raise RuntimeError "Invalid path: #{path}" unless path.end_with? '/*'
      @config[:svn] = path
    end
  end

end

# For debugging purposes, dump the configuration
if __FILE__ == $0
  require 'pp'
  pp ASF::Config.instance_variable_get(:@config)
end
