// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef SRC_DEVELOPER_DEBUG_SHARED_LOGGING_LOGGING_H_
#define SRC_DEVELOPER_DEBUG_SHARED_LOGGING_LOGGING_H_

// This header is meant to be the hub of debug logging: timers, logging, etc. There is no need to
// include the other headers directly.

#include <sstream>

#include "src/developer/debug/shared/logging/macros.h"
#include "src/developer/debug/shared/logging/debug.h"
#include "src/developer/debug/shared/logging/file_line_function.h"

namespace debug_ipc {

// Normally you would use this macro to create logging statements.
// Example:
//
// DEBUG_LOG(Job) << "Some job statement.";
// DEBUG_LOG(MessageLoop) << "Some event with id " << id;
//
// If the logging will occur on some other function, you can pass the location into the other macro:
//
//
// if (err.has_error())
//   LogSomewhereElse(FROM_HERE, LogCategory::kAgent, error.msg());
//
//  ...
//
// void LogSomewhereElse(FileLineFunction location, LogCategory category, std::string msg) {
//    ...
//    DEBUG_LOG_WITH_LOCATION(category, location) << msg;
// }
//

#define DEBUG_LOG_WITH_LOCATION(category, location)           \
  ::debug_ipc::LogStatement STRINGIFY(__debug_log, __LINE__)( \
      location, ::debug_ipc::LogCategory::k##category);       \
  STRINGIFY(__debug_log, __LINE__).stream()

#define DEBUG_LOG(category) \
  DEBUG_LOG_WITH_LOCATION(category, FROM_HERE)

// Creates a conditional logger depending whether the debug mode is active or not. See debug.h for
// more details.
class LogStatement {
 public:
  explicit LogStatement(FileLineFunction origin, LogCategory);
  ~LogStatement();

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

  const FileLineFunction& origin() const { return origin_; }
  LogCategory category() const { return category_; }
  double start_time() const { return start_time_; }

 private:
  FileLineFunction origin_;
  LogCategory category_;
  bool should_log_ = false;
  double start_time_;

  std::ostringstream stream_;
};

}  // namespace debug_ipc

#endif  // SRC_DEVELOPER_DEBUG_SHARED_LOGGING_LOGGING_H_
