// Copyright 2018 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 LIB_LOG_LOG_H_
#define LIB_LOG_LOG_H_

#include <lib/log/log_writer.h>

#ifdef __cplusplus
extern "C" {
#endif

// The values following constants must match the values defined in
// //sdk/fidl/fuchsia.logger/logger.fidl

// Max number of tags that can be attached to a message.
#define LOG_MAX_TAGS (5)

// Max individual tag length including terminating character.
#define LOG_MAX_TAG_LEN (63)

// Max individual message length including terminating character
#define LOG_MAX_MESSAGE_SIZE (2032)

// Returns true if writing messages with the given level is enabled in the
// global logger.
// |level| is one of VERBOSE(N), INFO, WARNING, ERROR, or FATAL.
#define LOG_LEVEL_IS_ENABLED(level) log_level_is_enabled(LOG_LEVEL_##level)

// Sets the minimum level for global logger. Log messages with a lower severity
// (or higher verbosity) than the given value will not be emitted. |level| is
// one of VERBOSE(N), INFO, WARNING, ERROR, or FATAL.
#define LOG_SET_MIN_LEVEL(level) log_set_min_level(LOG_LEVEL_##level)

// Initializes the logging system. Can be called multiple times.
//
// Arguments:
//   |min_level| - one of VERBOSE(int), INFO, WARNING, ERROR, FATAL
//   |log_writer| - a log_writer_t* to use when writing logs
//   |...| - tags to be attached to all messages
//
// Example usage:
//   LOG_INITIALIZE(INFO, log_writer, "program_name");
#define LOG_INITIALIZE(min_level, log_writer, ...)                     \
  do {                                                                 \
    const char* tags[] = {__VA_ARGS__};                                \
    size_t num_tags = sizeof(tags) / sizeof(tags[0]);                  \
    log_initialize(LOG_LEVEL_##min_level, log_writer, num_tags, tags); \
  } while (0)

// Frees and resets the global logging state. Should be called at program end to
// clean up memory taken up by this logging framework. If messages are logged
// after log_shutdown has been called the messages are silently dropped.
void log_shutdown(void);

// Log a formatted message at the given level with the given tags.
// Takes two sets of arguments.
//
// First set of arguments:
//   |...| - tags to be attached to the message
// Second set of arguments:
//   |level| - one of VERBOSE(int), INFO, WARNING, ERROR, FATAL
//   |format_string| - the format string for the message
//   |...| - arguments to be filled in to the format string
//
// Example usage:
//   LOGF(ERROR, "tag1", "tag2")("sorry that didn't work: %s", msg);
#define LOGF(level, ...)                              \
  do {                                                \
    const char* tags[] = {__VA_ARGS__};               \
    size_t num_tags = sizeof(tags) / sizeof(tags[0]); \
    log_level_t lvl = LOG_LEVEL_##level;              \
  LOGF_INNER

// Log a message at the given level with the given tags.
// Takes two sets of arguments.
//
// First set of arguments:
//   |...| - tags to be attached to the message
// Second set of arguments:
//   |level| - one of VERBOSE(int), INFO, WARNING, ERROR, FATAL
//   |message| - the message to log
//
// Example usage:
//   LOG(ERROR, "tag1", "tag2")("internal error encountered");
#define LOG(level, ...)                               \
  do {                                                \
    const char* tags[] = {__VA_ARGS__};               \
    size_t num_tags = sizeof(tags) / sizeof(tags[0]); \
    log_level_t lvl = LOG_LEVEL_##level;              \
  LOG_INNER

// The following are helper functions and macros used in the above macros, and
// should not be called directly outside of macro usage.

#define LOGF_INNER(message, ...)                                         \
  if (log_level_is_enabled(lvl)) {                                       \
    log_write_message_printf(lvl, num_tags, tags, message, __VA_ARGS__); \
  }                                                                      \
  }                                                                      \
  while (0)

#define LOG_INNER(message)                           \
  if (log_level_is_enabled(lvl)) {                   \
    log_write_message(lvl, num_tags, tags, message); \
  }                                                  \
  }                                                  \
  while (0)

bool log_level_is_enabled(log_level_t level);

void log_set_min_level(log_level_t min_level);

void log_initialize(log_level_t min_level, log_writer_t* log_writer, const size_t num_tags,
                    const char** tags);

void log_write_message(log_level_t level, size_t num_tags, const char** tags_ptr,
                       const char* message);

void log_write_message_printf(log_level_t level, size_t num_tags, const char** tags_ptr,
                              const char* message, ...);

#ifdef __cplusplus
}
#endif

#endif  // LIB_LOG_LOG_H_
