/*
 * Copyright (c) 2018-2021 mcumgr authors
 * Copyright (c) 2022 Laird Connectivity
 * Copyright (c) 2023 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#ifndef H_OS_MGMT_
#define H_OS_MGMT_

#ifdef __cplusplus
extern "C" {
#endif

/**
 * Command IDs for OS management group.
 */
#define OS_MGMT_ID_ECHO			0
#define OS_MGMT_ID_CONS_ECHO_CTRL	1
#define OS_MGMT_ID_TASKSTAT		2
#define OS_MGMT_ID_MPSTAT		3
#define OS_MGMT_ID_DATETIME_STR		4
#define OS_MGMT_ID_RESET		5
#define OS_MGMT_ID_MCUMGR_PARAMS	6
#define OS_MGMT_ID_INFO			7
#define OS_MGMT_ID_BOOTLOADER_INFO	8

/**
 * Command result codes for OS management group.
 */
enum os_mgmt_err_code_t {
	/** No error, this is implied if there is no ret value in the response */
	OS_MGMT_ERR_OK = 0,

	/** Unknown error occurred. */
	OS_MGMT_ERR_UNKNOWN,

	/** The provided format value is not valid. */
	OS_MGMT_ERR_INVALID_FORMAT,

	/** Query was not recognized. */
	OS_MGMT_ERR_QUERY_YIELDS_NO_ANSWER,

	/** RTC is not set */
	OS_MGMT_ERR_RTC_NOT_SET,

	/** RTC command failed */
	OS_MGMT_ERR_RTC_COMMAND_FAILED,

	/** Query was recognized but there is no valid value for the response. */
	OS_MGMT_ERR_QUERY_RESPONSE_VALUE_NOT_VALID,
};

/* Bitmask values used by the os info command handler. Note that the width of this variable is
 * 32-bits, allowing 32 flags, custom user-level implementations should start at
 * OS_MGMT_INFO_FORMAT_USER_CUSTOM_START and reference that directly as additional format
 * specifiers might be added to this list in the future.
 */
enum os_mgmt_info_formats {
	OS_MGMT_INFO_FORMAT_KERNEL_NAME = BIT(0),
	OS_MGMT_INFO_FORMAT_NODE_NAME = BIT(1),
	OS_MGMT_INFO_FORMAT_KERNEL_RELEASE = BIT(2),
	OS_MGMT_INFO_FORMAT_KERNEL_VERSION = BIT(3),
	OS_MGMT_INFO_FORMAT_BUILD_DATE_TIME = BIT(4),
	OS_MGMT_INFO_FORMAT_MACHINE = BIT(5),
	OS_MGMT_INFO_FORMAT_PROCESSOR = BIT(6),
	OS_MGMT_INFO_FORMAT_HARDWARE_PLATFORM = BIT(7),
	OS_MGMT_INFO_FORMAT_OPERATING_SYSTEM = BIT(8),

	OS_MGMT_INFO_FORMAT_USER_CUSTOM_START = BIT(9),
};

/* Structure provided in the MGMT_EVT_OP_OS_MGMT_INFO_CHECK notification callback */
struct os_mgmt_info_check {
	/* Input format string from the mcumgr client */
	struct zcbor_string *format;
	/* Bitmask of values specifying which outputs should be present */
	uint32_t *format_bitmask;
	/* Number of valid format characters parsed, must be incremented by 1 for each valid
	 * character
	 */
	uint16_t *valid_formats;
	/* Needs to be set to true if the OS name is being provided by external code */
	bool *custom_os_name;
};

/* Structure provided in the MGMT_EVT_OP_OS_MGMT_INFO_APPEND notification callback */
struct os_mgmt_info_append {
	/* The format bitmask from the processed commands, the bits should be cleared once
	 * processed, note that if all_format_specified is specified, the corresponding bits here
	 * will not be set
	 */
	uint32_t *format_bitmask;
	/* Will be true if the all 'a' specifier was provided */
	bool all_format_specified;
	/* The output buffer which the responses should be appended to. If prior_output is true, a
	 * space must be added prior to the output response
	 */
	uint8_t *output;
	/* The current size of the output response in the output buffer, must be updated to be the
	 * size of the output response after appending data
	 */
	uint16_t *output_length;
	/* The size of the output buffer, including null terminator character, if the output
	 * response would exceed this size, the function must abort and return false to return a
	 * memory error to the client
	 */
	uint16_t buffer_size;
	/* If there has been prior output, must be set to true if a response has been output */
	bool *prior_output;
};

#ifdef __cplusplus
}
#endif

#endif /* H_OS_MGMT_ */
