require 'tmpdir'
require 'yaml'
module RBatch
  class RunConf
    attr :path,:opt
    @yaml
    @@def_opt = {
      :conf_dir      => "<home>/conf",
      :common_conf_name => "common.yaml",
      :lib_dir       => "<home>/lib",
      :auto_lib_load => true,
      :forbid_double_run => false,
      :cmd_raise     => false,
      :cmd_timeout   => 0,
      :log_dir       => "<home>/log",
      :log_name      => "<date>_<time>_<prog>.log",
      :log_append    => true,
      :log_level     => "info",
      :log_stdout    => false,
      :log_delete_old_log => false,
      :log_delete_old_log_date => 7,
      :log_send_mail => false,
      :log_mail_to   => nil,
      :log_mail_from => "rbatch.localhost",
      :log_mail_server_host => "localhost",
      :log_mail_server_port => 25,
      :rbatch_journal_level => 1,
      :mix_rbatch_journal_to_logs => true
    }
    def initialize(path=nil)
      if path.nil?
        @opt = @@def_opt.clone
      else
        @path = path
        @opt = @@def_opt.clone
        load
      end
    end

    def load()
      begin
        @yaml = YAML::load_file(@path)
      rescue
        # when run_conf does not exist, do nothing.
        @yaml = false
      end
      if @yaml
        @yaml.each_key do |key|
          if @@def_opt.has_key?(key.to_sym)
            @opt[key.to_sym]=@yaml[key]
          else
            raise RBatch::RunConf::Exception, "\"#{key}\" is not available option"
          end
        end
      end
    end

    def has_key?(key)
      @opt.has_key?(key)
    end
    
    def merge!(opt)
      opt.each_key do |key|
        if @opt.has_key?(key)
          @opt[key] = opt[key]
        else
          raise RBatch::RunConf::Exception, "\"#{key}\" is not available option"
        end
      end
    end

    def merge(opt)
      tmp = @opt.clone
      opt.each_key do |key|
        if tmp.has_key?(key)
          tmp[key] = opt[key]
        else
          raise RBatch::RunConf::Exception, "\"#{key}\" is not available option"
        end
      end
      return tmp
    end

    def[](key)
      if @opt[key].nil?
        raise RBatch::RunConf::Exception, "Value of key=\"#{key}\" is nil"
      end
      @opt[key]
    end

    def[]=(key,value)
      if ! @opt.has_key?(key)
        raise RBatch::RunConf::Exception, "Key=\"#{key}\" does not exist"
      end
      @opt[key]=value
    end
  end

  class RunConf::Exception < Exception ; end

end