/*
 * Copyright (c) 2018 Intel Corporation.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(net_syslog, LOG_LEVEL_DBG);

#include <zephyr/kernel.h>

#include <zephyr/logging/log_backend.h>
#include <zephyr/logging/log_ctrl.h>

#include <stdlib.h>

BUILD_ASSERT(IS_ENABLED(CONFIG_LOG_BACKEND_NET), "syslog backend not enabled");

#define SLEEP_BETWEEN_PRINTS 3

#if defined(CONFIG_LOG_BACKEND_NET)
extern const struct log_backend *log_backend_net_get(void);
#endif

int main(void)
{
	int i, count, sleep;

	LOG_DBG("Starting");

	if (!IS_ENABLED(CONFIG_LOG_BACKEND_NET_AUTOSTART)) {
		/* Example how to start the backend if autostart is disabled.
		 * This is useful if the application needs to wait the network
		 * to be fully up before the syslog-net is able to work.
		 */
		const struct log_backend *backend = log_backend_net_get();

		if (!log_backend_is_active(backend)) {
			log_backend_init(backend);
			log_backend_enable(backend, backend->cb->ctx, CONFIG_LOG_MAX_LEVEL);
		}
	}

	if (CONFIG_NET_SAMPLE_SEND_ITERATIONS) {
		count = CONFIG_NET_SAMPLE_SEND_ITERATIONS;
		sleep = 500;

		/* This will let the Docker process to start listening */
		k_msleep(1500);

		LOG_DBG("Sending total %d messages", 4 * count);
	} else {
		count = 60 / SLEEP_BETWEEN_PRINTS;
		sleep = SLEEP_BETWEEN_PRINTS * MSEC_PER_SEC;
	}

	/* Allow some setup time before starting to send data */
	k_msleep(sleep);

	i = count;

	do {
		LOG_ERR("Error message (%d)", i);
		LOG_WRN("Warning message (%d)", i);
		LOG_INF("Info message (%d)", i);
		LOG_DBG("Debug message (%d)", i);

		k_msleep(sleep);

	} while (--i);

	LOG_DBG("Stopped after %d msg", count);

	if (CONFIG_NET_SAMPLE_SEND_ITERATIONS) {
		/* We get here when doing Docker based testing */
		k_msleep(1000);
		exit(0);
	}
	return 0;
}
