// Copyright 2015 Google Inc. 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.

#ifndef COBALT_DOM_CONSOLE_H_
#define COBALT_DOM_CONSOLE_H_

#include <set>
#include <string>

#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "cobalt/script/execution_state.h"
#include "cobalt/script/wrappable.h"

namespace cobalt {
namespace dom {

// The "console" object provides access to the browser's debugging console.
// The specifics of how it works vary from browser to browser, but there is
// a de facto set of features that are typically provided.
//    https://developer.mozilla.org/en-US/docs/Web/API/Console
//
// Although this feature is non-standard and is not on a standards track,
// WHATWG made an attempt to assess the level of support across browsers at
// https://github.com/DeveloperToolsWG/console-object.
class Console : public script::Wrappable {
 public:
  enum Level { kDebug, kError, kInfo, kLog, kWarning };

  class Listener {
   public:
    explicit Listener(Console* console);
    virtual ~Listener();
    virtual void OnMessage(const std::string& message, Level level) = 0;

   private:
    base::WeakPtr<Console> console_;
  };

  explicit Console(script::ExecutionState* execution_state);

  // Web API: Console
  //
  // Outputs a message.
  void Debug(const std::string& text) const;
  void Log(const std::string& text) const;
  void Info(const std::string& text) const;
  void Error(const std::string& text) const;
  void Warn(const std::string& text) const;
  // Outputs a JavaScript stack trace.
  void Trace() const;

  // Gets the string description of a message level.
  static const char* GetLevelAsString(Level level);

  DEFINE_WRAPPABLE_TYPE(Console);

 private:
  typedef std::set<Listener*> ListenerSet;

  ~Console() OVERRIDE { weak_ptr_factory_.InvalidateWeakPtrs(); }

  void AddListener(Listener* listener);
  void RemoveListener(Listener* listener);
  void NotifyListeners(const std::string& message, Level level) const;

  base::WeakPtr<Console> GetWeakPtr() { return weak_ptr_factory_.GetWeakPtr(); }

  script::ExecutionState* const execution_state_;
  ListenerSet listeners_;

  base::WeakPtrFactory<Console> weak_ptr_factory_;

  DISALLOW_COPY_AND_ASSIGN(Console);
};

}  // namespace dom
}  // namespace cobalt

#endif  // COBALT_DOM_CONSOLE_H_
