/**
 * @brief Bluetooth Media Control Client (MCC) interface
 *
 * Updated to the Media Control Profile specification revision 1.0
 *
 * @defgroup bt_gatt_mcc Media Control Client (MCC)
 *
 * @ingroup bluetooth
 * @{
 *
 * [Experimental] Users should note that the APIs can change
 * as a part of ongoing development.
 */

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

#ifndef ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_MCC_
#define ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_MCC_

#include <stdint.h>

#include <zephyr/bluetooth/conn.h>
#include <zephyr/net/buf.h>
#include <zephyr/bluetooth/audio/media_proxy.h>

#ifdef __cplusplus
extern "C" {
#endif

/**** Callback functions ******************************************************/

/**
 * @brief Callback function for bt_mcc_discover_mcs()
 *
 * Called when a media control server is discovered
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 */
typedef void (*bt_mcc_discover_mcs_cb)(struct bt_conn *conn, int err);

/**
 * @brief Callback function for bt_mcc_read_player_name()
 *
 * Called when the player name is read or notified
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param name          Player name
 */
typedef void (*bt_mcc_read_player_name_cb)(struct bt_conn *conn, int err, const char *name);

#ifdef CONFIG_BT_OTS_CLIENT
/**
 * @brief Callback function for bt_mcc_read_icon_obj_id()
 *
 * Called when the icon object ID is read
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param icon_id       The ID of the Icon Object. This is a UINT48 in a uint64_t
 */
typedef void (*bt_mcc_read_icon_obj_id_cb)(struct bt_conn *conn, int err, uint64_t id);
#endif /* CONFIG_BT_OTS_CLIENT */

/**
 * @brief Callback function for bt_mcc_read_icon_url()
 *
 * Called when the icon URL is read
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param icon_url      The URL of the Icon
 */
typedef void (*bt_mcc_read_icon_url_cb)(struct bt_conn *conn, int err, const char *icon_url);

/**
 * @brief Callback function for track changed notifications
 *
 * Called when a track change is notified.
 *
 * The track changed characteristic is a special case.  It can not be read or
 * set, it can only be notified.
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 */
typedef void (*bt_mcc_track_changed_ntf_cb)(struct bt_conn *conn, int err);


/**
 * @brief Callback function for bt_mcc_read_track_title()
 *
 * Called when the track title is read or notified
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param title         The title of the track
 */
typedef void (*bt_mcc_read_track_title_cb)(struct bt_conn *conn, int err, const char *title);

/**
 * @brief Callback function for bt_mcc_read_track_duration()
 *
 * Called when the track duration is read or notified
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param dur           The duration of the track
 */
typedef void (*bt_mcc_read_track_duration_cb)(struct bt_conn *conn, int err, int32_t dur);

/**
 * @brief Callback function for bt_mcc_read_track_position()
 *
 * Called when the track position is read or notified
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param pos           The Track Position
 */
typedef void (*bt_mcc_read_track_position_cb)(struct bt_conn *conn, int err, int32_t pos);

/**
 * @brief Callback function for bt_mcc_set_track_position()
 *
 * Called when the track position is set
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param pos           The Track Position set (or attempted to set)
 */
typedef void (*bt_mcc_set_track_position_cb)(struct bt_conn *conn, int err, int32_t pos);

/**
 * @brief Callback function for bt_mcc_read_playback_speed()
 *
 * Called when the playback speed is read or notified
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param speed         The Playback Speed
 */
typedef void (*bt_mcc_read_playback_speed_cb)(struct bt_conn *conn, int err, int8_t speed);

/**
 * @brief Callback function for bt_mcc_set_playback_speed()
 *
 * Called when the playback speed is set
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param speed         The Playback Speed set (or attempted to set)
 */
typedef void (*bt_mcc_set_playback_speed_cb)(struct bt_conn *conn, int err, int8_t speed);

/**
 * @brief Callback function for bt_mcc_read_seeking_speed()
 *
 * Called when the seeking speed is read or notified
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param speed         The Seeking Speed
 */
typedef void (*bt_mcc_read_seeking_speed_cb)(struct bt_conn *conn, int err, int8_t speed);

#ifdef CONFIG_BT_OTS_CLIENT
/**
 * @brief Callback function for bt_mcc_read_segments_obj_id()
 *
 * Called when the track segments object ID is read
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param id            The Track Segments Object ID (UINT48)
 */
typedef void (*bt_mcc_read_segments_obj_id_cb)(struct bt_conn *conn, int err, uint64_t id);

/**
 * @brief Callback function for bt_mcc_read_current_track_obj_id()
 *
 * Called when the current track object ID is read or notified
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param id            The Current Track Object ID (UINT48)
 */
typedef void (*bt_mcc_read_current_track_obj_id_cb)(struct bt_conn *conn, int err, uint64_t id);

/**
 * @brief Callback function for bt_mcc_set_current_track_obj_id()
 *
 * Called when the current track object ID is set
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param id            The Object ID (UINT48) set (or attempted to set)
 */
typedef void (*bt_mcc_set_current_track_obj_id_cb)(struct bt_conn *conn, int err, uint64_t id);

/**
 * @brief Callback function for bt_mcc_read_next_track_obj_id_obj()
 *
 * Called when the next track object ID is read or notified
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param id            The Next Track Object ID (UINT48)
 */
typedef void (*bt_mcc_read_next_track_obj_id_cb)(struct bt_conn *conn, int err, uint64_t id);

/**
 * @brief Callback function for bt_mcc_set_next_track_obj_id()
 *
 * Called when the next track object ID is set
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param id            The Object ID (UINT48) set (or attempted to set)
 */
typedef void (*bt_mcc_set_next_track_obj_id_cb)(struct bt_conn *conn, int err, uint64_t id);

/**
 * @brief Callback function for bt_mcc_read_parent_group_obj_id()
 *
 * Called when the parent group object ID is read or notified
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param id            The Parent Group Object ID (UINT48)
 */
typedef void (*bt_mcc_read_parent_group_obj_id_cb)(struct bt_conn *conn, int err, uint64_t id);

/**
 * @brief Callback function for bt_mcc_read_current_group_obj_id()
 *
 * Called when the current group object ID is read or notified
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param id            The Current Group Object ID (UINT48)
 */
typedef void (*bt_mcc_read_current_group_obj_id_cb)(struct bt_conn *conn, int err, uint64_t id);

/**
 * @brief Callback function for bt_mcc_set_current_group_obj_id()
 *
 * Called when the current group object ID is set
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param id            The Object ID (UINT48) set (or attempted to set)
 */
typedef void (*bt_mcc_set_current_group_obj_id_cb)(struct bt_conn *conn, int err, uint64_t obj_id);

#endif /* CONFIG_BT_OTS_CLIENT */

/**
 * @brief Callback function for bt_mcc_read_playing_order()
 *
 * Called when the playing order is read or notified
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param order         The playback order
 */
typedef void (*bt_mcc_read_playing_order_cb)(struct bt_conn *conn, int err, uint8_t order);

/**
 * @brief Callback function for bt_mcc_set_playing_order()
 *
 * Called when the playing order is set
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param order         The Playing Order set (or attempted to set)
 */
typedef void (*bt_mcc_set_playing_order_cb)(struct bt_conn *conn, int err, uint8_t order);

/**
 * @brief Callback function for bt_mcc_read_playing_orders_supported()
 *
 * Called when the supported playing orders are read or notified
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param orders        The playing orders supported (bitmap)
 */
typedef void (*bt_mcc_read_playing_orders_supported_cb)(struct bt_conn *conn, int err,
							uint16_t orders);

/**
 * @brief Callback function for bt_mcc_read_media_state()
 *
 * Called when the media state is read or notified
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param state         The Media State
 */
typedef void (*bt_mcc_read_media_state_cb)(struct bt_conn *conn, int err, uint8_t state);

/**
 * @brief Callback function for bt_mcc_send_cmd()
 *
 * Called when a command is sent, i.e. when the media control point is set
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param cmd           The command sent
 */
typedef void (*bt_mcc_send_cmd_cb)(struct bt_conn *conn, int err, const struct mpl_cmd *cmd);

/**
 * @brief Callback function for command notifications
 *
 * Called when the media control point is notified
 *
 * Notifications for commands (i.e. for writes to the media control point) use a
 * different parameter structure than what is used for sending commands (writing
 * to the media control point)
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param ntf           The command notification
 */
typedef void (*bt_mcc_cmd_ntf_cb)(struct bt_conn *conn, int err, const struct mpl_cmd_ntf *ntf);

/**
 * @brief Callback function for bt_mcc_read_opcodes_supported()
 *
 * Called when the supported opcodes (commands) are read or notified
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param opcodes       The supported opcodes
 */
typedef void (*bt_mcc_read_opcodes_supported_cb)(struct bt_conn *conn, int err,
						 uint32_t opcodes);

#ifdef CONFIG_BT_OTS_CLIENT
/**
 * @brief Callback function for bt_mcc_send_search()
 *
 * Called when a search is sent, i.e. when the search control point is set
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param search        The search set (or attempted to set)
 */
typedef void (*bt_mcc_send_search_cb)(struct bt_conn *conn, int err,
				      const struct mpl_search *search);

/**
 * @brief Callback function for search notifications
 *
 * Called when the search control point is notified
 *
 * Notifications for searches (i.e. for writes to the search control point) use a
 * different parameter structure than what is used for sending searches (writing
 * to the search control point)
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param ntf           The search notification
 */
typedef void (*bt_mcc_search_ntf_cb)(struct bt_conn *conn, int err,
				     uint8_t result_code);

/**
 * @brief Callback function for bt_mcc_read_search_results_obj_id()
 *
 * Called when the search results object ID is read or notified
 *
 * Note that the Search Results Object ID value may be zero, in case the
 * characteristic does not exist on the server.  (This will be the case if
 * there has not been a successful search.)
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param id            The Search Results Object ID (UINT48)
 */
typedef void (*bt_mcc_read_search_results_obj_id_cb)(struct bt_conn *conn,
						     int err, uint64_t id);
#endif /* CONFIG_BT_OTS_CLIENT */

/**
 * @brief Callback function for bt_mcc_read_content_control_id()
 *
 * Called when the content control ID is read
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param ccid          The Content Control ID
 */
typedef void (*bt_mcc_read_content_control_id_cb)(struct bt_conn *conn,
						  int err, uint8_t ccid);
#ifdef CONFIG_BT_OTS_CLIENT
/**** Callback functions for the included Object Transfer service *************/

/**
 * @brief Callback function for object selected
 *
 * Called when an object is selected
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 */
typedef void (*bt_mcc_otc_obj_selected_cb)(struct bt_conn *conn, int err);

/**
 * @brief Callback function for bt_mcc_otc_read_object_meatadata()
 *
 * Called when object metadata is read
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 */
typedef void (*bt_mcc_otc_obj_metadata_cb)(struct bt_conn *conn, int err);

/**
 * @brief Callback function for bt_mcc_otc_read_icon_object()
 *
 * Called when the icon object is read
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param buf           Buffer containing the object contents
 *
 * If err is EMSGSIZE, the object contents have been truncated.
 */
typedef void (*bt_mcc_otc_read_icon_object_cb)(struct bt_conn *conn, int err,
					       struct net_buf_simple *buf);

/**
 * @brief Callback function for bt_mcc_otc_read_track_segments_object()
 *
 * Called when the track segments object is read
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param buf           Buffer containing the object contents
 *
 * If err is EMSGSIZE, the object contents have been truncated.
 */
typedef void (*bt_mcc_otc_read_track_segments_object_cb)(struct bt_conn *conn, int err,
							 struct net_buf_simple *buf);

/**
 * @brief Callback function for bt_mcc_otc_read_current_track_object()
 *
 * Called when the current track object is read
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param buf           Buffer containing the object contents
 *
 * If err is EMSGSIZE, the object contents have been truncated.
 */
typedef void (*bt_mcc_otc_read_current_track_object_cb)(struct bt_conn *conn, int err,
							struct net_buf_simple *buf);

/**
 * @brief Callback function for bt_mcc_otc_read_next_track_object()
 *
 * Called when the next track object is read
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param buf           Buffer containing the object contents
 *
 * If err is EMSGSIZE, the object contents have been truncated.
 */
typedef void (*bt_mcc_otc_read_next_track_object_cb)(struct bt_conn *conn, int err,
						     struct net_buf_simple *buf);

/**
 * @brief Callback function for bt_mcc_otc_read_parent_group_object()
 *
 * Called when the parent group object is read
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param buf           Buffer containing the object contents
 *
 * If err is EMSGSIZE, the object contents have been truncated.
 */
typedef void (*bt_mcc_otc_read_parent_group_object_cb)(struct bt_conn *conn, int err,
						       struct net_buf_simple *buf);

/**
 * @brief Callback function for bt_mcc_otc_read_current_group_object()
 *
 * Called when the current group object is read
 *
 * @param conn          The connection that was used to initialise the media control client
 * @param err           Error value. 0 on success, GATT error or errno on fail
 * @param buf           Buffer containing the object contents
 *
 * If err is EMSGSIZE, the object contents have been truncated.
 */
typedef void (*bt_mcc_otc_read_current_group_object_cb)(struct bt_conn *conn, int err,
							struct net_buf_simple *buf);

#endif /* CONFIG_BT_OTS_CLIENT */


/**
 * @brief Media control client callbacks
 */
struct bt_mcc_cb {
	bt_mcc_discover_mcs_cb                   discover_mcs;
	bt_mcc_read_player_name_cb               read_player_name;
#ifdef CONFIG_BT_OTS_CLIENT
	bt_mcc_read_icon_obj_id_cb               read_icon_obj_id;
#endif /* CONFIG_BT_OTS_CLIENT */
	bt_mcc_read_icon_url_cb                  read_icon_url;
	bt_mcc_track_changed_ntf_cb              track_changed_ntf;
	bt_mcc_read_track_title_cb               read_track_title;
	bt_mcc_read_track_duration_cb            read_track_duration;
	bt_mcc_read_track_position_cb            read_track_position;
	bt_mcc_set_track_position_cb             set_track_position;
	bt_mcc_read_playback_speed_cb            read_playback_speed;
	bt_mcc_set_playback_speed_cb             set_playback_speed;
	bt_mcc_read_seeking_speed_cb             read_seeking_speed;
#ifdef CONFIG_BT_OTS_CLIENT
	bt_mcc_read_segments_obj_id_cb           read_segments_obj_id;
	bt_mcc_read_current_track_obj_id_cb      read_current_track_obj_id;
	bt_mcc_set_current_track_obj_id_cb       set_current_track_obj_id;
	bt_mcc_read_next_track_obj_id_cb         read_next_track_obj_id;
	bt_mcc_set_next_track_obj_id_cb          set_next_track_obj_id;
	bt_mcc_read_current_group_obj_id_cb      read_current_group_obj_id;
	bt_mcc_set_current_group_obj_id_cb       set_current_group_obj_id;
	bt_mcc_read_parent_group_obj_id_cb       read_parent_group_obj_id;
#endif /* CONFIG_BT_OTS_CLIENT */
	bt_mcc_read_playing_order_cb	         read_playing_order;
	bt_mcc_set_playing_order_cb              set_playing_order;
	bt_mcc_read_playing_orders_supported_cb  read_playing_orders_supported;
	bt_mcc_read_media_state_cb               read_media_state;
	bt_mcc_send_cmd_cb                       send_cmd;
	bt_mcc_cmd_ntf_cb                        cmd_ntf;
	bt_mcc_read_opcodes_supported_cb         read_opcodes_supported;
#ifdef CONFIG_BT_OTS_CLIENT
	bt_mcc_send_search_cb                    send_search;
	bt_mcc_search_ntf_cb                     search_ntf;
	bt_mcc_read_search_results_obj_id_cb     read_search_results_obj_id;
#endif /* CONFIG_BT_OTS_CLIENT */
	bt_mcc_read_content_control_id_cb        read_content_control_id;
#ifdef CONFIG_BT_OTS_CLIENT
	bt_mcc_otc_obj_selected_cb               otc_obj_selected;
	bt_mcc_otc_obj_metadata_cb               otc_obj_metadata;
	bt_mcc_otc_read_icon_object_cb           otc_icon_object;
	bt_mcc_otc_read_track_segments_object_cb otc_track_segments_object;
	bt_mcc_otc_read_current_track_object_cb  otc_current_track_object;
	bt_mcc_otc_read_next_track_object_cb     otc_next_track_object;
	bt_mcc_otc_read_current_group_object_cb  otc_current_group_object;
	bt_mcc_otc_read_parent_group_object_cb   otc_parent_group_object;
#endif /* CONFIG_BT_OTS_CLIENT */
};

/**** Functions ***************************************************************/

/**
 * @brief Initialize Media Control Client
 *
 * @param cb    Callbacks to be used
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_init(struct bt_mcc_cb *cb);


/**
 * @brief Discover Media Control Service
 *
 * Discover Media Control Service (MCS) on the server given by the connection
 * Optionally subscribe to notifications.
 *
 * Shall be called once, after media control client initialization and before
 * using other media control client functionality.
 *
 * @param conn  Connection to the peer device
 * @param subscribe   Whether to subscribe to notifications
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_discover_mcs(struct bt_conn *conn, bool subscribe);

/**
 * @brief Read Media Player Name
 *
 * @param conn  Connection to the peer device
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_read_player_name(struct bt_conn *conn);

#ifdef CONFIG_BT_OTS_CLIENT
/**
 * @brief Read Icon Object ID
 *
 * @param conn  Connection to the peer device
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_read_icon_obj_id(struct bt_conn *conn);
#endif /* CONFIG_BT_OTS_CLIENT */

/**
 * @brief Read Icon Object URL
 *
 * @param conn  Connection to the peer device
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_read_icon_url(struct bt_conn *conn);

/**
 * @brief Read Track Title
 *
 * @param conn  Connection to the peer device
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_read_track_title(struct bt_conn *conn);

/**
 * @brief Read Track Duration
 *
 * @param conn  Connection to the peer device
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_read_track_duration(struct bt_conn *conn);

/**
 * @brief Read Track Position
 *
 * @param conn  Connection to the peer device
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_read_track_position(struct bt_conn *conn);

/**
 * @brief Set Track position
 *
 * @param conn  Connection to the peer device
 * @param pos   Track position
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_set_track_position(struct bt_conn *conn, int32_t pos);

/**
 * @brief Read Playback speed
 *
 * @param conn  Connection to the peer device
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_read_playback_speed(struct bt_conn *conn);

/**
 * @brief Set Playback Speed
 *
 * @param conn  Connection to the peer device
 * @param speed Playback speed
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_set_playback_speed(struct bt_conn *conn, int8_t speed);

/**
 * @brief Read Seeking speed
 *
 * @param conn  Connection to the peer device
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_read_seeking_speed(struct bt_conn *conn);

#ifdef CONFIG_BT_OTS_CLIENT
/**
 * @brief Read Track Segments Object ID
 *
 * @param conn  Connection to the peer device
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_read_segments_obj_id(struct bt_conn *conn);

/**
 * @brief Read Current Track Object ID
 *
 * @param conn  Connection to the peer device
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_read_current_track_obj_id(struct bt_conn *conn);

/**
 * @brief Set Current Track Object ID
 *
 * Set the Current Track to the the track given by the @p id parameter
 *
 * @param conn  Connection to the peer device
 * @param id    Object Transfer Service ID (UINT48) of the track to set as the current track
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_set_current_track_obj_id(struct bt_conn *conn, uint64_t id);

/**
 * @brief Read Next Track Object ID
 *
 * @param conn  Connection to the peer device
 * @param id    Object Transfer Service ID (UINT48) of the track to set as the current track
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_read_next_track_obj_id(struct bt_conn *conn);

/**
 * @brief Set Next Track Object ID
 *
 * Set the Next Track to the the track given by the @p id parameter
 *
 * @param conn  Connection to the peer device
 * @param id   Object Transfer Service ID (UINT48) of the track to set as the next track
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_set_next_track_obj_id(struct bt_conn *conn, uint64_t id);

/**
 * @brief Read Current Group Object ID
 *
 * @param conn  Connection to the peer device
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_read_current_group_obj_id(struct bt_conn *conn);

/**
 * @brief Set Current Group Object ID
 *
 * Set the Current Group to the the group given by the @p id parameter
 *
 * @param conn  Connection to the peer device
 * @param id   Object Transfer Service ID (UINT48) of the group to set as the current group
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_set_current_group_obj_id(struct bt_conn *conn, uint64_t id);

/**
 * @brief Read Parent Group Object ID
 *
 * @param conn  Connection to the peer device
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_read_parent_group_obj_id(struct bt_conn *conn);
#endif /* CONFIG_BT_OTS_CLIENT */

/**
 * @brief Read Playing Order
 *
 * @param conn  Connection to the peer device
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_read_playing_order(struct bt_conn *conn);

/**
 * @brief Set Playing Order
 *
 * @param conn  Connection to the peer device
 * @param order Playing order
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_set_playing_order(struct bt_conn *conn, uint8_t order);

/**
 * @brief Read Playing Orders Supported
 *
 * @param conn  Connection to the peer device
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_read_playing_orders_supported(struct bt_conn *conn);

/**
 * @brief Read Media State
 *
 * @param conn  Connection to the peer device
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_read_media_state(struct bt_conn *conn);

/**
 * @brief Send a command
 *
 * Write a command (e.g. "play", "pause") to the server's media control point.
 *
 * @param conn  Connection to the peer device
 * @param cmd   The command to send
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_send_cmd(struct bt_conn *conn, const struct mpl_cmd *cmd);

/**
 * @brief Read Opcodes Supported
 *
 * @param conn  Connection to the peer device
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_read_opcodes_supported(struct bt_conn *conn);

#ifdef CONFIG_BT_OTS_CLIENT
/**
 * @brief Send a Search command
 *
 * Write a search to the server's search control point.
 *
 * @param conn   Connection to the peer device
 * @param search The search
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_send_search(struct bt_conn *conn, const struct mpl_search *search);

/**
 * @brief Search Results Group Object ID
 *
 * @param conn  Connection to the peer device
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_read_search_results_obj_id(struct bt_conn *conn);
#endif /* CONFIG_BT_OTS_CLIENT */

/**
 * @brief Read Content Control ID
 *
 * @param conn  Connection to the peer device
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_read_content_control_id(struct bt_conn *conn);

#ifdef CONFIG_BT_OTS_CLIENT
/**
 * @brief Read the current object metadata
 *
 * @param conn  Connection to the peer device
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_otc_read_object_metadata(struct bt_conn *conn);

/**
 * @brief Read the Icon Object
 *
 * @param conn  Connection to the peer device
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_otc_read_icon_object(struct bt_conn *conn);

/**
 * @brief Read the Track Segments Object
 *
 * @param conn  Connection to the peer device
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_otc_read_track_segments_object(struct bt_conn *conn);

/**
 * @brief Read the Current Track Object
 *
 * @param conn  Connection to the peer device
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_otc_read_current_track_object(struct bt_conn *conn);

/**
 * @brief Read the Next Track Object
 *
 * @param conn  Connection to the peer device
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_otc_read_next_track_object(struct bt_conn *conn);

/**
 * @brief Read the Current Group Object
 *
 * @param conn  Connection to the peer device
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_otc_read_current_group_object(struct bt_conn *conn);

/**
 * @brief Read the Parent Group Object
 *
 * @param conn  Connection to the peer device
 *
 * @return 0 if success, errno on failure.
 */
int bt_mcc_otc_read_parent_group_object(struct bt_conn *conn);

#if defined(CONFIG_BT_MCC_SHELL)
struct bt_ots_client *bt_mcc_otc_inst(struct bt_conn *conn);
#endif /* defined(CONFIG_BT_MCC_SHELL) */
#endif /* CONFIG_BT_OTS_CLIENT */

#ifdef __cplusplus
}
#endif

/**
 * @}
 */

#endif /* ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_MCC__ */
