// Copyright 2015 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 "services/log/log_impl.h"

#include <utility>

#include "base/logging.h"
#include "base/strings/stringprintf.h"
#include "mojo/public/cpp/application/application_connection.h"
#include "mojo/services/log/interfaces/entry.mojom.h"

namespace mojo {
namespace log {
namespace {

std::string LogLevelToString(int32_t log_level) {
  if (log_level <= kLogLevelVerbose - 3)
    return "VERBOSE4+";
  switch (log_level) {
    case kLogLevelVerbose - 2:
      return "VERBOSE3";
    case kLogLevelVerbose - 1:
      return "VERBOSE2";
    case kLogLevelVerbose:
      return "VERBOSE1";
    case kLogLevelInfo:
      return "INFO";
    case kLogLevelWarning:
      return "WARNING";
    case kLogLevelError:
      return "ERROR";
  }
  return "FATAL";
}

}  // namespace

LogImpl::LogImpl(const std::string& remote_url,
                 InterfaceRequest<Log> request,
                 PrintLogMessageFunction print_log_message_function)
    : remote_url_(remote_url),
      binding_(this, std::move(request)),
      print_log_message_function_(print_log_message_function) {}

LogImpl::~LogImpl() {}

// static
void LogImpl::Create(ApplicationConnection* connection,
                     InterfaceRequest<Log> request,
                     PrintLogMessageFunction print_log_message_function) {
  DCHECK(connection);
  DCHECK(print_log_message_function);

  const std::string& remote_url = connection->GetRemoteApplicationURL();
  if (remote_url.empty()) {
    LOG(ERROR) << "No remote URL.";
    return;
  }

  new LogImpl(remote_url, std::move(request),
              std::move(print_log_message_function));
}

void LogImpl::AddEntry(EntryPtr entry) {
  DCHECK(entry);
  print_log_message_function_(FormatEntry(entry));
}

// This should return:
// <REMOTE_URL> [LOG_LEVEL] SOURCE_FILE:SOURCE_LINE MESSAGE
std::string LogImpl::FormatEntry(const EntryPtr& entry) {
  std::string source;
  if (entry->source_file) {
    source += entry->source_file.To<std::string>();
    if (entry->source_line) {
      base::StringAppendF(&source, ":%u", entry->source_line);
    }
    source += ": ";
  }

  return base::StringPrintf(
      "<%s> [%s] %s%s", remote_url_.c_str(),
      LogLevelToString(entry->log_level).c_str(), source.c_str(),
      entry->message ? entry->message.To<std::string>().c_str()
                     : "<no message>");
}

}  // namespace log
}  // namespace mojo
