/*
 * Copyright (c) 2018 Nordic Semiconductor ASA
 * Copyright (c) 2021 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr/logging/log.h>
#include <zephyr/logging/log_ctrl.h>
#include <zephyr/logging/log_output.h>
#include <zephyr/logging/log_output_dict.h>
#include <zephyr/sys/__assert.h>
#include <zephyr/sys/util.h>

static void buffer_write(log_output_func_t outf, uint8_t *buf, size_t len,
			 void *ctx)
{
	int processed;

	do {
		processed = outf(buf, len, ctx);
		len -= processed;
		buf += processed;
	} while (len != 0);
}

void log_dict_output_msg_process(const struct log_output *output,
				 struct log_msg *msg, uint32_t flags)
{
	struct log_dict_output_normal_msg_hdr_t output_hdr;
	void *source = (void *)log_msg_get_source(msg);

	/* Keep sync with header in struct log_msg */
	output_hdr.type = MSG_NORMAL;
	output_hdr.domain = msg->hdr.desc.domain;
	output_hdr.level = msg->hdr.desc.level;
	output_hdr.package_len = msg->hdr.desc.package_len;
	output_hdr.data_len = msg->hdr.desc.data_len;
	output_hdr.timestamp = msg->hdr.timestamp;

	output_hdr.source = (source != NULL) ?
				(IS_ENABLED(CONFIG_LOG_RUNTIME_FILTERING) ?
					log_dynamic_source_id(source) :
					log_const_source_id(source)) :
				0U;

	buffer_write(output->func, (uint8_t *)&output_hdr, sizeof(output_hdr),
		     (void *)output);

	size_t len;
	uint8_t *data = log_msg_get_package(msg, &len);

	if (len > 0U) {
		buffer_write(output->func, data, len, (void *)output);
	}

	data = log_msg_get_data(msg, &len);
	if (len > 0U) {
		buffer_write(output->func, data, len, (void *)output);
	}

	log_output_flush(output);
}

void log_dict_output_dropped_process(const struct log_output *output, uint32_t cnt)
{
	struct log_dict_output_dropped_msg_t msg;

	msg.type = MSG_DROPPED_MSG;
	msg.num_dropped_messages = MIN(cnt, 9999);

	buffer_write(output->func, (uint8_t *)&msg, sizeof(msg),
		     (void *)output);
}
