/*
 * Copyright (c) 2020 Linumiz
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <stdlib.h>
#include <zephyr/shell/shell.h>
#include <zephyr/drivers/flash.h>
#include <zephyr/dfu/mcuboot.h>
#include <zephyr/dfu/flash_img.h>
#include <zephyr/mgmt/hawkbit/hawkbit.h>
#include <zephyr/mgmt/hawkbit/config.h>
#include <zephyr/mgmt/hawkbit/autohandler.h>
#include "hawkbit_firmware.h"
#include "hawkbit_device.h"

LOG_MODULE_DECLARE(hawkbit, CONFIG_HAWKBIT_LOG_LEVEL);

static void cmd_run(const struct shell *sh, size_t argc, char **argv)
{
	ARG_UNUSED(argc);
	ARG_UNUSED(argv);

	LOG_INF("Run started from %s", sh->name);
	shell_info(sh, "Starting hawkBit run...");

	hawkbit_autohandler(false);

	switch (hawkbit_autohandler_wait(UINT32_MAX, K_FOREVER)) {
	case HAWKBIT_UNCONFIRMED_IMAGE:
		shell_error(sh, "Image is unconfirmed."
				"Rebooting to revert back to previous confirmed image");
		break;

	case HAWKBIT_CANCEL_UPDATE:
		shell_info(sh, "hawkBit update cancelled from server");
		break;

	case HAWKBIT_NO_UPDATE:
		shell_info(sh, "No update found");
		break;

	case HAWKBIT_OK:
		shell_info(sh, "Image already updated");
		break;

	case HAWKBIT_UPDATE_INSTALLED:
		shell_info(sh, "Update installed");
		break;

	case HAWKBIT_DOWNLOAD_ERROR:
		shell_error(sh, "Download error");
		break;

	case HAWKBIT_NETWORKING_ERROR:
		shell_error(sh, "Networking error");
		break;

	case HAWKBIT_METADATA_ERROR:
		shell_error(sh, "Metadata error");
		break;

	case HAWKBIT_NOT_INITIALIZED:
		shell_error(sh, "hawkBit not initialized");
		break;

	default:
		shell_error(sh, "Invalid response");
		break;
	}
	k_sleep(K_MSEC(1));
}

static int cmd_info(const struct shell *sh, size_t argc, char *argv)
{
	ARG_UNUSED(argc);
	ARG_UNUSED(argv);

	char device_id[DEVICE_ID_HEX_MAX_SIZE] = {0},
	     firmware_version[BOOT_IMG_VER_STRLEN_MAX] = {0};

	hawkbit_get_firmware_version(firmware_version, BOOT_IMG_VER_STRLEN_MAX);
	hawkbit_get_device_identity(device_id, DEVICE_ID_HEX_MAX_SIZE);

	shell_print(sh, "Action id: %d", hawkbit_get_action_id());
	shell_print(sh, "Unique device id: %s", device_id);
	shell_print(sh, "Firmware Version: %s", firmware_version);
	shell_print(sh, "Server address: %s", hawkbit_get_server_addr());
	shell_print(sh, "Server port: %d", hawkbit_get_server_port());
	shell_print(sh, "DDI security token: %s",
		    (IS_ENABLED(CONFIG_HAWKBIT_DDI_NO_SECURITY)
			     ? "<disabled>"
			     : hawkbit_get_ddi_security_token()));

	return 0;
}

static int cmd_init(const struct shell *sh, size_t argc, char *argv)
{
	ARG_UNUSED(argc);
	ARG_UNUSED(argv);

	shell_info(sh, "Init hawkBit ...");

	hawkbit_init();

	return 0;
}

static int cmd_reset(const struct shell *sh, size_t argc, char *argv)
{
	ARG_UNUSED(argc);
	ARG_UNUSED(argv);

	int ret = hawkbit_reset_action_id();

	shell_print(sh, "Reset action id %s", (ret == 0) ? "success" : "failed");

	return 0;
}

#ifdef CONFIG_HAWKBIT_SET_SETTINGS_RUNTIME

static int cmd_set_addr(const struct shell *sh, size_t argc, char **argv)
{
	if (argc < 2) {
		shell_error(sh, "Invalid number of arguments");
		return -EINVAL;
	}

	hawkbit_set_server_addr(argv[1]);

	return 0;
}

static int cmd_set_port(const struct shell *sh, size_t argc, char **argv)
{
	if (argc < 2) {
		shell_error(sh, "Invalid number of arguments");
		return -EINVAL;
	}

	hawkbit_set_server_port(atoi(argv[1]));

	return 0;
}

#ifndef CONFIG_HAWKBIT_DDI_NO_SECURITY
static int cmd_set_token(const struct shell *sh, size_t argc, char **argv)
{
	if (argc < 2) {
		shell_error(sh, "Invalid number of arguments");
		return -EINVAL;
	}

	hawkbit_set_ddi_security_token(argv[1]);

	return 0;
}
#endif /* CONFIG_HAWKBIT_DDI_NO_SECURITY */

SHELL_STATIC_SUBCMD_SET_CREATE(
	sub_hawkbit_set,
	SHELL_CMD(addr, NULL, "Set hawkBit server address", cmd_set_addr),
	SHELL_CMD(port, NULL, "Set hawkBit server port", cmd_set_port),
#ifndef CONFIG_HAWKBIT_DDI_NO_SECURITY
	SHELL_CMD(ddi_token, NULL, "Set hawkBit DDI Security token", cmd_set_token),
#endif
	SHELL_SUBCMD_SET_END);
#endif /* CONFIG_HAWKBIT_SET_SETTINGS_RUNTIME */

SHELL_STATIC_SUBCMD_SET_CREATE(
	sub_hawkbit,
	SHELL_CMD(info, NULL, "Dump hawkBit information", cmd_info),
	SHELL_CMD(init, NULL, "Initialize hawkBit", cmd_init),
	SHELL_CMD(run, NULL, "Trigger an hawkBit update run", cmd_run),
	SHELL_CMD(reset, NULL, "Reset the hawkBit action id", cmd_reset),
#ifdef CONFIG_HAWKBIT_SET_SETTINGS_RUNTIME
	SHELL_CMD(set, &sub_hawkbit_set, "Set hawkBit settings", NULL),
#endif
	SHELL_SUBCMD_SET_END);

SHELL_CMD_REGISTER(hawkbit, &sub_hawkbit, "hawkBit commands", NULL);
