// 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_DEBUG_H_
#define SRC_DEVELOPER_DEBUG_SHARED_LOGGING_DEBUG_H_

#include <initializer_list>
#include <set>
#include <sstream>
#include <vector>

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

namespace debug {

class DebugLogStatement;

// This API controls and queries the debug functionality of the debug tools within the debug ipc.

// Activate this flag to activate debug output.
void SetDebugLogging(bool);
bool IsDebugLoggingActive();

// The debug logging in debug_agent can also be enabled dynamically remotely via
//   fx log --set-severity core/debug_agent#DEBUG
// Although you usually want more options such as
//   fx log --set-severity core/debug_agent#DEBUG --tag debug_agent --since_now --hide_metadata \
//      --pretty
//
// `ffx log` doesn't work yet because of https://fxbug.dev/42182432.

// Log Categories ----------------------------------------------------------------------------------

enum class LogCategory {
  // Associated with general Debug Agent events.
  kAgent,

  // Associated with low-level arm64 events.
  kArchArm64,

  // Associated with low-level x64 events.
  kArchx64,

  // Associated with the lifetime of breakpoints.
  kBreakpoint,

  // Associated with job events and filtering.
  kJob,

  // Tracking of events within the message loop.
  // Normally only required for debugging it.
  kMessageLoop,

  // Mainly tracks the lifetime of a process.
  kProcess,

  // Log the received and sent remote API calls.
  kRemoteAPI,

  // Associated with the zxdb client session.
  kSession,

  // Associated with debugging the setting stores.
  kSetting,

  // Associated with logging on tests.
  kTest,

  // Will output all TIME_BLOCK() entries.
  // This is mostly used to profile how much time the overall functionality
  // of the debugger is taking.
  kTiming,

  // Associated with threads (exception, state, etc.)
  kThread,

  // Associated with watchpoints.
  kWatchpoint,

  // Associated with the multithreaded work pool.
  kWorkerPool,

  // Associated with debug adapter.
  kDebugAdapter,

  // Associated with the build ID index.
  kBuildIDIndex,

  // Associated with process symbols.
  kProcessSymbols,

  // Associated with module symbols.
  kModuleSymbols,

  // Associated with system symbols.
  kSystemSymbols,

  // Associated with the download manager.
  kDownloadManager,

  // All the previous categories are enabled.
  // Log statements in this category will always be outputting if debug logging is enabled.
  kAll,

  // Used for any log statements for which the category could not be found.
  kNone,
};

void SetLogCategories(std::initializer_list<LogCategory>);

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

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

  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

#endif  // SRC_DEVELOPER_DEBUG_SHARED_LOGGING_DEBUG_H_
