/*
 * Copyright (c) 2021 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */
#ifndef ZEPHYR_INCLUDE_LOGGING_LOG_INTERNAL_H_
#define ZEPHYR_INCLUDE_LOGGING_LOG_INTERNAL_H_

#include <zephyr/types.h>
#include <zephyr/sys/__assert.h>
#include <zephyr/logging/log_core.h>
#include <zephyr/sys/mpsc_pbuf.h>

#ifdef __cplusplus
extern "C" {
#endif

/* Header contains declarations of functions used internally in the logging,
 * shared between various portions of logging subsystem. Functions are internal
 * not intended to be used outside, including logging backends.
 */

/** @brief Structure wrapper to be used for memory section. */
struct log_mpsc_pbuf {
	struct mpsc_pbuf_buffer buf;
};

/** @brief Structure wrapper to be used for memory section. */
struct log_msg_ptr {
	union log_msg_generic *msg;
};

/** @brief Indicate to the log core that one log message has been dropped.
 *
 * @param buffered True if dropped message was already buffered and it is being
 * dropped to free space for another message. False if message is being dropped
 * because allocation failed.
 */
void z_log_dropped(bool buffered);

/** @brief Read and clear current drop indications counter.
 *
 * @return Dropped count.
 */
uint32_t z_log_dropped_read_and_clear(void);

/** @brief Check if there are any pending drop notifications.
 *
 * @retval true Pending unreported drop indications.
 * @retval false No pending unreported drop indications.
 */
bool z_log_dropped_pending(void);

/** @brief Free allocated buffer.
 *
 * @param buf Buffer.
 */
void z_log_free(void *buf);

/* Initialize runtime filters */
void z_log_runtime_filters_init(void);

/* Initialize links. */
void z_log_links_initiate(void);

/* Activate links.
 * Attemp to activate links,
 *
 * @param active_mask     Mask with links to activate. N bit set indicates that Nth
 * link should be activated.
 *
 * @param[in, out] offset Offset assigned to domains. Initialize to 0 before first use.
 *
 * @return Mask with links that still remain inactive.
 */
uint32_t z_log_links_activate(uint32_t active_mask, uint8_t *offset);

/* Notify log_core that a backend was enabled. */
void z_log_notify_backend_enabled(void);

/** @brief Get pointer to the filter set of the log source.
 *
 * @param source_id Source ID.
 *
 * @return Pointer to the filter set.
 */
static inline uint32_t *z_log_dynamic_filters_get(uint32_t source_id)
{
	return &__log_dynamic_start[source_id].filters;
}

/** @brief Get number of registered sources. */
static inline uint32_t z_log_sources_count(void)
{
	return log_const_source_id(__log_const_end);
}

/** @brief Return number of external domains.
 *
 * @return Number of external domains.
 */
uint8_t z_log_ext_domain_count(void);

/** @brief Initialize module for handling logging message. */
void z_log_msg_init(void);

/** @brief Commit log message.
 *
 * @param msg Message.
 */
void z_log_msg_commit(struct log_msg *msg);

/** @brief Get pending log message.
 *
 * @param[out] backoff Recommended backoff needed to maintain ordering of processed
 * messages. Used only when links are using dedicated buffers.
 *
 * @param Message or null if no pending messages.
 */
union log_msg_generic *z_log_msg_claim(k_timeout_t *backoff);

/** @brief Free message.
 *
 * @param msg Message.
 */
void z_log_msg_free(union log_msg_generic *msg);

/** @brief Check if there are any message pending.
 *
 * @retval true if at least one message is pending.
 * @retval false if no message is pending.
 */
bool z_log_msg_pending(void);

static inline void z_log_notify_drop(const struct mpsc_pbuf_buffer *buffer,
				     const union mpsc_pbuf_generic *item)
{
	ARG_UNUSED(buffer);
	ARG_UNUSED(item);

	z_log_dropped(true);
}

/** @brief Get tag.
 *
 * @return Tag. Null if feature is disabled.
 */
const char *z_log_get_tag(void);

/** @brief Check if domain is local.
 *
 * @param domain_id Domain ID.
 *
 * @return True if domain is local.
 */
static inline bool z_log_is_local_domain(uint8_t domain_id)
{
	return !IS_ENABLED(CONFIG_LOG_MULTIDOMAIN) ||
			(domain_id == Z_LOG_LOCAL_DOMAIN_ID);
}

/** @brief Get timestamp.
 *
 * @return Timestamp.
 */
log_timestamp_t z_log_timestamp(void);

#ifdef __cplusplus
}
#endif

#endif /* ZEPHYR_INCLUDE_LOGGING_LOG_INTERNAL_H_ */
