// Copyright 2018 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "cobalt/debug/backend/log_agent.h"

#include "base/logging.h"

namespace cobalt {
namespace debug {
namespace backend {

namespace {
// Definitions from the set specified here:
// https://chromedevtools.github.io/devtools-protocol/1-3/Log
constexpr char kInspectorDomain[] = "Log";

// Error levels:
constexpr char kInfoLevel[] = "info";
constexpr char kWarningLevel[] = "warning";
constexpr char kErrorLevel[] = "error";

// State keys
constexpr char kEnabledState[] = "enabled";

const char* GetLogLevelFromSeverity(int severity) {
  switch (severity) {
    // LOG_VERBOSE is a pseudo-severity, which we never get here.
    case logging::LOG_INFO:
      return kInfoLevel;
    case logging::LOG_WARNING:
      return kWarningLevel;
    case logging::LOG_ERROR:
    case logging::LOG_ERROR_REPORT:
    case logging::LOG_FATAL:
      return kErrorLevel;
  }
  NOTREACHED();
  return "";
}
}  // namespace

LogAgent::LogAgent(DebugDispatcher* dispatcher)
    : dispatcher_(dispatcher),
      ALLOW_THIS_IN_INITIALIZER_LIST(commands_(this, kInspectorDomain)),
      enabled_(false) {
  DCHECK(dispatcher_);

  commands_["enable"] = &LogAgent::Enable;
  commands_["disable"] = &LogAgent::Disable;

  // Get log output while still making it available elsewhere.
  log_message_handler_callback_id_ =
      base::LogMessageHandler::GetInstance()->AddCallback(
          base::Bind(&LogAgent::OnLogMessage, base::Unretained(this)));
}

LogAgent::~LogAgent() {
  base::LogMessageHandler::GetInstance()->RemoveCallback(
      log_message_handler_callback_id_);
}

void LogAgent::Thaw(JSONObject agent_state) {
  if (agent_state) {
    agent_state->GetBoolean(kEnabledState, &enabled_);
  }

  dispatcher_->AddDomain(kInspectorDomain, commands_.Bind());
}

JSONObject LogAgent::Freeze() {
  dispatcher_->RemoveDomain(kInspectorDomain);

  JSONObject agent_state(new base::DictionaryValue());
  agent_state->SetBoolean(kEnabledState, enabled_);
  return agent_state.Pass();
}

void LogAgent::Enable(const Command& command) {
  enabled_ = true;
  command.SendResponse();
}

void LogAgent::Disable(const Command& command) {
  enabled_ = false;
  command.SendResponse();
}

bool LogAgent::OnLogMessage(int severity, const char* file, int line,
                            size_t message_start, const std::string& str) {
  UNREFERENCED_PARAMETER(file);
  UNREFERENCED_PARAMETER(line);
  UNREFERENCED_PARAMETER(message_start);
  DCHECK(this);

  if (enabled_) {
    // Our custom "Log.browserEntryAdded" event is just like "Log.entryAdded"
    // except it only shows up in the debug console and not in remote devtools.
    // TODO: Flesh out the rest of LogEntry properties (source, timestamp)
    JSONObject params(new base::DictionaryValue());
    params->SetString("entry.text", str);
    params->SetString("entry.level", GetLogLevelFromSeverity(severity));
    dispatcher_->SendEvent(std::string(kInspectorDomain) + ".browserEntryAdded",
                           params);
  }

  // Don't suppress the log message.
  return false;
}

}  // namespace backend
}  // namespace debug
}  // namespace cobalt
