/*
 * Copyright (c) 2018-2021 mcumgr authors
 * Copyright (c) 2022 Laird Connectivity
 *
 * 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

/* 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 corrisponding 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;
};

/**
 * @brief Registers the OS management command handler group.
 */
void os_mgmt_register_group(void);

#ifdef __cplusplus
}
#endif

#endif /* H_OS_MGMT_ */
