class ReeLogger::Config

def build

def build
  is_rollbar_enabled = parse_bool_string(ENV['LOG_ROLLBAR_ENABLED'])
  to_obj({
    file_path: ENV['LOG_FILE_PATH'],
    file_auto_flush: parse_bool_string(ENV['LOG_FILE_AUTO_FLUSH']),
    levels: {
      file: parse_level(ENV['LOG_LEVEL_FILE']),
      stdout: parse_level(ENV['LOG_LEVEL_STDOUT']),
      rollbar: is_rollbar_enabled ? parse_level(ENV['LOG_LEVEL_ROLLBAR']) : nil,
    },
    rollbar: {
      enabled: is_rollbar_enabled,
      access_token: is_rollbar_enabled ? ENV.fetch('LOG_ROLLBAR_ACCESS_TOKEN') : nil,
      environment: is_rollbar_enabled ? ENV.fetch('LOG_ROLLBAR_ENVIRONMENT') : nil,
      branch: ENV['LOG_ROLLBAR_BRANCH'],
      host: ENV['LOG_ROLLBAR_HOST']
    },
    rate_limit: {
      interval: get_int_value('LOG_RATE_LIMIT_INTERVAL', RATE_LIMIT_INTERVAL),
      max_count: get_int_value('LOG_RATE_LIMIT_MAX_COUNT', RATE_LIMIT_MAX_COUNT),
    },
    default_filter_words: %w[
      password token credential bearer authorization
    ]
  })
end

def get_int_value(name, default)

def get_int_value(name, default)
  value = ENV[name]
  v = if value.to_s.strip.empty?
    default
  else
    Integer(value)
  end
  if v < 0
    raise ArgumentError, "ENV['#{name}'] should be > 0"
  end
  v
end

def parse_bool_string(bool)

def parse_bool_string(bool)
  return false if is_blank(bool)
  return bool.to_s.downcase == "true"
end

def parse_level(level)

def parse_level(level)
  return if is_blank(level)
  validate_inclusion(level, LEVELS)
  level.to_sym
end