/* Full-stack IoT client example. */

/*
 * Copyright (c) 2018 Linaro Ltd
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr/kernel.h>

#include "dhcp.h"
#include "protocol.h"

#include <zephyr/net/sntp.h>
#include <zephyr/net/net_config.h>
#include <zephyr/net/net_event.h>

#define LOG_LEVEL CONFIG_LOG_DEFAULT_LEVEL
#include <zephyr/logging/log.h>

LOG_MODULE_REGISTER(net_google_iot_mqtt, LOG_LEVEL_INF);

/* This comes from newlib. */
#include <time.h>
#include <inttypes.h>

int64_t time_base;

int do_sntp(void)
{
	int rc;
	struct sntp_time sntp_time;
	char time_str[sizeof("1970-01-01T00:00:00")];

	LOG_INF("Sending NTP request for current time:");

	rc = sntp_simple("time.google.com", SYS_FOREVER_MS, &sntp_time);
	if (rc == 0) {
		time_base = sntp_time.seconds * MSEC_PER_SEC - k_uptime_get();

		/* Convert time to make sure. */
		time_t now = sntp_time.seconds;
		struct tm now_tm;

		gmtime_r(&now, &now_tm);
		strftime(time_str, sizeof(time_str), "%FT%T", &now_tm);
		LOG_INF("  Acquired time: %s", time_str);

	} else {
		LOG_ERR("  Failed to acquire SNTP, code %d\n", rc);
	}
	return rc;
}

/*
 * Things that make sense in a demo app that would need to be more
 * robust in a real application:
 *
 * - DHCP happens once.  If it fails, or we change networks, the
 *   network will just stop working.
 *
 */
int main(void)
{
	LOG_INF("Main entered");

	app_dhcpv4_startup();

	LOG_INF("Should have DHCPv4 lease at this point.");

	/* early return if we failed to acquire time */
	if (do_sntp() != 0) {
		LOG_ERR("Failed to get NTP time");
		return 0;
	}

	mqtt_startup("mqtt.googleapis.com", 8883);
	return 0;
}
