
module Tw
  class Conf

    def self.default
      {
        'version' => Tw::VERSION,
        'consumer_key' => 'AYhhkOC8H2yTZyelz3uw',
        'consumer_secret' => '28Ba8YyFDSPgoCYAmH5ANqOmT6qVS8gIhKnUiDbIpU',
        'default_user' => nil,
        'users' => {}
      }
    end

    def self.[](key)
      ENV[key] || conf[key]
    end

    def self.[]=(key,value)
      conf[key] = value
    end

    def self.conf_file
      @@conf_file ||= "#{ENV['HOME']}/.tw.yml"
    end

    def self.conf_file=(fpath)
      @@conf_file = fpath
    end

    def self.conf
      @@conf ||= (
                  res = default
                  if File.exists? self.conf_file
                    begin
                      data = nil
                      self.open_conf_file do |f|
                        data = YAML::load f.read
                      end
                      if data['version'] < REQUIRE_VERSION
                        puts "This is tw version #{Tw::VERSION}."
                        puts "Your config file is old ("+data['version']+"). Reset tw settings?"
                        puts "[Y/n]"
                        res = data if STDIN.gets =~ /^n/i
                      else
                        res = data
                      end
                    rescue => e
                      STDERR.puts e
                      File.delete self.conf_file
                    end
                  end
                  res
                  )
    end

    def self.to_yaml
      self.conf.to_yaml
    end

    def self.save
      open_conf_file('w+') do |f|
        f.write conf.to_yaml
      end
    end

    def self.update_twitter_config(force_update=false)
      if self['twitter_config'].kind_of? Hash and
          self['twitter_config']['last_updated_at']+60*60*24 > Time.now.to_i and
          !force_update
        return
      end
      self['twitter_config'] = {}
      self['twitter_config']['short_url_length'] = Tw::Client.client.configuration.short_url_length
      self['twitter_config']['short_url_length_https'] = Tw::Client.client.configuration.short_url_length_https
      self['twitter_config']['last_updated_at'] = Time.now.to_i
      self.save
    end

    private
    def self.open_conf_file(opt=nil, &block)
      if block_given?
        yield open(self.conf_file, opt)
      else
        return open(self.conf_file, opt)
      end
      File.chmod 0600, self.conf_file if File.exists? self.conf_file
    end
  end
end
