// Copyright 2016 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/console_component.h"

#include "base/bind.h"
#include "base/values.h"

namespace cobalt {
namespace debug {

namespace {
// Definitions from the set specified here:
// https://developer.chrome.com/devtools/docs/protocol/1.1/console

// Command "methods" (names):
const char kDisable[] = "Console.disable";
const char kEnable[] = "Console.enable";

// Parameter fields:
const char kMessageText[] = "message.text";
const char kMessageLevel[] = "message.level";
const char kMessageSource[] = "message.source";

// Constant parameter values:
const char kMessageSourceValue[] = "console-api";

// Events:
const char kMessageAdded[] = "Console.messageAdded";
}  // namespace

ConsoleComponent::Listener::Listener(dom::Console* console,
                                     ConsoleComponent* console_component)
    : dom::Console::Listener(console), console_component_(console_component) {}

void ConsoleComponent::Listener::OnMessage(const std::string& message,
                                           dom::Console::Level level) {
  console_component_->OnMessageAdded(message, level);
}

ConsoleComponent::ConsoleComponent(ComponentConnector* connector,
                                   dom::Console* console)
    : connector_(connector),
      ALLOW_THIS_IN_INITIALIZER_LIST(console_listener_(console, this)) {
  DCHECK(connector_);
  connector_->AddCommand(
      kDisable, base::Bind(&ConsoleComponent::Disable, base::Unretained(this)));
  connector_->AddCommand(
      kEnable, base::Bind(&ConsoleComponent::Enable, base::Unretained(this)));
}

JSONObject ConsoleComponent::Disable(const JSONObject& params) {
  UNREFERENCED_PARAMETER(params);
  return JSONObject(new base::DictionaryValue());
}

JSONObject ConsoleComponent::Enable(const JSONObject& params) {
  UNREFERENCED_PARAMETER(params);
  return JSONObject(new base::DictionaryValue());
}

void ConsoleComponent::OnMessageAdded(const std::string& text,
                                      dom::Console::Level level) {
  JSONObject params(new base::DictionaryValue());
  params->SetString(kMessageText, text);
  params->SetString(kMessageLevel, dom::Console::GetLevelAsString(level));
  params->SetString(kMessageSource, kMessageSourceValue);
  connector_->SendEvent(kMessageAdded, params);
}

}  // namespace debug
}  // namespace cobalt
