// Copyright 2019 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.

#ifndef COBALT_BASE_CONSOLE_LOG_H_
#define COBALT_BASE_CONSOLE_LOG_H_

#include <sstream>

#include "base/logging.h"

namespace base {

// This class serves a similar purpose to LogMessage in logging.h, but for the
// CLOG macro that sends the message to the JS console through DebuggerHooks.
class ConsoleMessage {
 public:
  ConsoleMessage(::logging::LogSeverity severity,
                 const DebuggerHooks& debugger_hooks)
      : severity_(severity), debugger_hooks_(debugger_hooks) {}

  ~ConsoleMessage() { debugger_hooks_.ConsoleLog(severity_, stream_.str()); }

  std::ostream& stream() { return stream_; }

 private:
  ::logging::LogSeverity severity_;
  const DebuggerHooks& debugger_hooks_;
  std::ostringstream stream_;
};

#if defined(ENABLE_DEBUGGER)
#define CLOG_IS_ON true
#else
#define CLOG_IS_ON false
#endif

#define CLOG_STREAM(severity, debugger_hooks) \
  ::base::ConsoleMessage(::logging::LOG_##severity, (debugger_hooks)).stream()
#define CLOG(severity, debugger_hooks) \
  LAZY_STREAM(CLOG_STREAM(severity, debugger_hooks), CLOG_IS_ON)
#define CLOG_IF(severity, debugger_hooks, condition) \
  LAZY_STREAM(CLOG_STREAM(severity, debugger_hooks), CLOG_IS_ON && (condition))

}  // namespace base

#endif  // COBALT_BASE_CONSOLE_LOG_H_
