/*
 * Copyright (c) 2021 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/** @file
 *  @brief Bluetooth Mesh SAR Configuration Client Model APIs.
 */
#ifndef BT_MESH_SAR_CFG_CLI_H__
#define BT_MESH_SAR_CFG_CLI_H__

#include <zephyr/bluetooth/mesh.h>
#include <zephyr/bluetooth/mesh/sar_cfg.h>

/**
 * @brief Bluetooth Mesh
 * @defgroup bt_mesh_sar_cfg_cli Bluetooth Mesh SAR Configuration Client Model
 * @ingroup bt_mesh
 * @{
 */

#ifdef __cplusplus
extern "C" {
#endif

/** Mesh SAR Configuration Client Model Context */
struct bt_mesh_sar_cfg_cli {
	/** Access model pointer. */
	const struct bt_mesh_model *model;

	/* Publication structure instance */
	struct bt_mesh_model_pub pub;

	/* Synchronous message timeout in milliseconds. */
	int32_t timeout;

	/* Internal parameters for tracking message responses. */
	struct bt_mesh_msg_ack_ctx ack_ctx;
};

/**
 *
 * @brief SAR Configuration Client model composition data entry.
 *
 * @param[in] _cli Pointer to a @ref bt_mesh_sar_cfg_cli instance.
 */
#define BT_MESH_MODEL_SAR_CFG_CLI(_cli)                                  \
	BT_MESH_MODEL_CB(BT_MESH_MODEL_ID_SAR_CFG_CLI,                         \
			 _bt_mesh_sar_cfg_cli_op, _cli.pub, _cli,                  \
			 &_bt_mesh_sar_cfg_cli_cb)

/** @brief Get the SAR Transmitter state of the target node.
 *
 *  @param net_idx Network index to encrypt with.
 *  @param addr    Target node address.
 *  @param rsp     Status response parameter.
 *
 *  @return 0 on success, or (negative) error code on failure.
 */
int bt_mesh_sar_cfg_cli_transmitter_get(uint16_t net_idx, uint16_t addr,
					struct bt_mesh_sar_tx *rsp);

/** @brief Set the SAR Transmitter state of the target node.
 *
 *  @param net_idx Network index to encrypt with.
 *  @param addr    Target node address.
 *  @param set     New SAR Transmitter state to set on the target node.
 *  @param rsp     Status response parameter.
 *
 *  @return 0 on success, or (negative) error code on failure.
 */
int bt_mesh_sar_cfg_cli_transmitter_set(uint16_t net_idx, uint16_t addr,
					const struct bt_mesh_sar_tx *set,
					struct bt_mesh_sar_tx *rsp);

/** @brief Get the SAR Receiver state of the target node.
 *
 *  @param net_idx Network index to encrypt with.
 *  @param addr    Target node address.
 *  @param rsp     Status response parameter.
 *
 *  @return 0 on success, or (negative) error code on failure.
 */
int bt_mesh_sar_cfg_cli_receiver_get(uint16_t net_idx, uint16_t addr,
				     struct bt_mesh_sar_rx *rsp);

/** @brief Set the SAR Receiver state of the target node.
 *
 *  @param net_idx Network index to encrypt with.
 *  @param addr    Target node address.
 *  @param set     New SAR Receiver state to set on the target node.
 *  @param rsp     Status response parameter.
 *
 *  @return 0 on success, or (negative) error code on failure.
 */
int bt_mesh_sar_cfg_cli_receiver_set(uint16_t net_idx, uint16_t addr,
				     const struct bt_mesh_sar_rx *set,
				     struct bt_mesh_sar_rx *rsp);

/** @brief Get the current transmission timeout value.
 *
 *  @return The configured transmission timeout in milliseconds.
 */
int32_t bt_mesh_sar_cfg_cli_timeout_get(void);

/** @brief Set the transmission timeout value.
 *
 *  @param timeout The new transmission timeout.
 */
void bt_mesh_sar_cfg_cli_timeout_set(int32_t timeout);

/** @cond INTERNAL_HIDDEN */
extern const struct bt_mesh_model_op _bt_mesh_sar_cfg_cli_op[];
extern const struct bt_mesh_model_cb _bt_mesh_sar_cfg_cli_cb;
/** @endcond */

#ifdef __cplusplus
}
#endif

#endif /* BT_MESH_SAR_CFG_CLI_H__ */

/** @} */
