// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "components/drive/event_logger.h"

#include "base/logging.h"
#include "base/strings/stringprintf.h"

namespace drive {

EventLogger::Event::Event(
    int id, logging::LogSeverity severity, const std::string& what)
    : id(id),
      severity(severity),
      when(base::Time::Now()),
      what(what) {
}

EventLogger::EventLogger()
    : history_size_(kDefaultHistorySize),
      next_event_id_(0) {
}

EventLogger::~EventLogger() {
}

void EventLogger::LogRawString(logging::LogSeverity severity,
                               const std::string& what) {
  base::AutoLock auto_lock(lock_);
  history_.push_back(Event(next_event_id_, severity, what));
  ++next_event_id_;
  if (history_.size() > history_size_)
    history_.pop_front();
}

void EventLogger::Log(logging::LogSeverity severity, const char* format, ...) {
  std::string what;

  va_list args;
  va_start(args, format);
  base::StringAppendV(&what, format, args);
  va_end(args);

  DVLOG(1) << what;
  LogRawString(severity, what);
}

void EventLogger::SetHistorySize(size_t history_size) {
  base::AutoLock auto_lock(lock_);
  history_.clear();
  history_size_ = history_size;
}

std::vector<EventLogger::Event> EventLogger::GetHistory() {
  base::AutoLock auto_lock(lock_);
  std::vector<Event> output;
  output.assign(history_.begin(), history_.end());
  return output;
}


}  // namespace drive
