/*
 * 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 IS_ENABLED(CONFIG_LOG_BACKEND_NET)
extern const struct log_backend *log_backend_net_get(void);
#endif

void 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);
	}
}
