/* @file
 * @brief Internal APIs for Audio Capabilities handling
 *
 * Copyright (c) 2021 Intel Corporation
 * Copyright (c) 2021-2022 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#ifndef ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_CAPABILITIES_H_
#define ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_CAPABILITIES_H_

#include <bluetooth/audio/audio.h>

#ifdef __cplusplus
extern "C" {
#endif

/* Get list of capabilities by type */
sys_slist_t *bt_audio_capability_get(uint8_t type);


/** @brief Audio Capability type */
enum bt_audio_capability_framing {
	BT_AUDIO_CAPABILITY_UNFRAMED_SUPPORTED     = 0x00,
	BT_AUDIO_CAPABILITY_UNFRAMED_NOT_SUPPORTED = 0x01,
};

/** @def BT_AUDIO_CAPABILITY_PREF
 *  @brief Helper to declare elements of @ref bt_audio_capability_pref
 *
 *  @param _framing Framing Support
 *  @param _phy Preferred Target PHY
 *  @param _rtn Preferred Retransmission number
 *  @param _latency Preferred Maximum Transport Latency (msec)
 *  @param _pd_min Minimum Presentation Delay (usec)
 *  @param _pd_max Maximum Presentation Delay (usec)
 *  @param _pref_pd_min Preferred Minimum Presentation Delay (usec)
 *  @param _pref_pd_max Preferred Maximum Presentation Delay (usec)
 */
#define BT_AUDIO_CAPABILITY_PREF(_framing, _phy, _rtn, _latency, _pd_min, \
				 _pd_max, _pref_pd_min, _pref_pd_max) \
	{ \
		.framing = _framing, \
		.phy = _phy, \
		.rtn = _rtn, \
		.latency = _latency, \
		.pd_min = _pd_min, \
		.pd_max = _pd_max, \
		.pref_pd_min = _pref_pd_min, \
		.pref_pd_max = _pref_pd_max, \
	}

/** @brief Audio Capability Preference structure. */
struct bt_audio_capability_pref {
	/** @brief Framing support value
	 *
	 *  Unlike the other fields, this is not a preference but whether
	 *  the capability supports unframed ISOAL PDUs.
	 *
	 *  Possible values: BT_AUDIO_CAPABILITY_UNFRAMED_SUPPORTED and
	 *  BT_AUDIO_CAPABILITY_UNFRAMED_NOT_SUPPORTED.
	 */
	uint8_t framing;

	/** Preferred PHY */
	uint8_t phy;

	/** Preferred Retransmission Number */
	uint8_t rtn;

	/** Preferred Transport Latency in ms */
	uint16_t latency;

	/** @brief Minimum Presentation Delay in us
	 *
	 *  Unlike the other fields, this is not a preference but a minimum
	 *  requirement.
	 */
	uint32_t pd_min;

	/** @brief Maximum Presentation Delay in us
	 *
	 *  Unlike the other fields, this is not a preference but a maximum
	 *  requirement.
	 */
	uint32_t pd_max;

	/** @brief Preferred minimum Presentation Delay in us*/
	uint32_t pref_pd_min;

	/** @brief Preferred maximum Presentation Delay	in us */
	uint32_t pref_pd_max;
};

struct bt_audio_capability; /* Handle circular dependency */

/** @brief Capability operations structure.
 *
 *  These are only used for unicast streams and broadcast sink streams.
 */
struct bt_audio_capability_ops {
	/** @brief Capability config callback
	 *
	 *  Config callback is called whenever a new Audio Stream needs to be
	 *  allocated.
	 *
	 *  @param conn Connection object
	 *  @param ep Remote Audio Endpoint being configured
	 *  @param type Type of the endpoint.
	 *  @param cap Local Audio Capability being configured
	 *  @param codec Codec configuration
	 *
	 *  @return Allocated Audio Stream object or NULL in case of error.
	 */
	struct bt_audio_stream *(*config)(struct bt_conn *conn,
					  struct bt_audio_ep *ep,
					  enum bt_audio_pac_type type,
					  struct bt_audio_capability *cap,
					  struct bt_codec *codec);

	/** @brief Capability reconfig callback
	 *
	 *  Reconfig callback is called whenever an Audio Stream needs to be
	 *  reconfigured with different codec configuration.
	 *
	 *  @param stream Stream object being reconfigured.
	 *  @param cap Local Audio Capability being reconfigured
	 *  @param codec Codec configuration
	 *
	 *  @return 0 in case of success or negative value in case of error.
	 */
	int (*reconfig)(struct bt_audio_stream *stream,
			struct bt_audio_capability *cap,
			struct bt_codec *codec);

	/** @brief Capability QoS callback
	 *
	 *  QoS callback is called whenever an Audio Stream Quality of
	 *  Service needs to be configured.
	 *
	 *  @param stream Stream object being reconfigured.
	 *  @param QoS Quality of Service configuration
	 *
	 *  @return 0 in case of success or negative value in case of error.
	 */
	int (*qos)(struct bt_audio_stream *stream, struct bt_codec_qos *qos);

	/** @brief Capability Enable callback
	 *
	 *  Enable callback is called whenever an Audio Stream is about to be
	 *  enabled.
	 *
	 *  @param stream Stream object being enabled.
	 *  @param meta_count Number of metadata entries
	 *  @param meta Metadata entries
	 *
	 *  @return 0 in case of success or negative value in case of error.
	 */
	int (*enable)(struct bt_audio_stream *stream,
		      struct bt_codec_data *meta,
		      size_t meta_count);

	/** @brief Capability Start callback
	 *
	 *  Start callback is called whenever an Audio Stream is about to
	 *  start streaming.
	 *
	 *  @param stream Stream object.
	 *
	 *  @return 0 in case of success or negative value in case of error.
	 */
	int (*start)(struct bt_audio_stream *stream);

	/** @brief Capability Metadata callback
	 *
	 *  Metadata callback is called whenever an Audio Stream needs to
	 *  update its metadata.
	 *
	 *  @param stream Stream object.
	 *  @param meta_count Number of metadata entries
	 *  @param meta Metadata entries
	 *
	 *  @return 0 in case of success or negative value in case of error.
	 */
	int (*metadata)(struct bt_audio_stream *stream,
			struct bt_codec_data *meta,
			size_t meta_count);

	/** @brief Capability Disable callback
	 *
	 *  Disable callback is called whenever an Audio Stream is about to be
	 *  disabled.
	 *
	 *  @param stream Stream object being disabled.
	 *
	 *  @return 0 in case of success or negative value in case of error.
	 */
	int (*disable)(struct bt_audio_stream *stream);

	/** @brief Capability Stop callback
	 *
	 *  Stop callback is called whenever an Audio Stream is about to
	 *  stop streaming.
	 *
	 *  @param stream Stream object.
	 *
	 *  @return 0 in case of success or negative value in case of error.
	 */
	int (*stop)(struct bt_audio_stream *stream);

	/** @brief Capability release callback
	 *
	 *  Release callback is called whenever a new Audio Stream needs to be
	 *  deallocated.
	 *
	 *  @param stream Stream object.
	 *
	 *  @return 0 in case of success or negative value in case of error.
	 */
	int (*release)(struct bt_audio_stream *stream);
};

/** @brief Audio Capability structure.
 *
 *  Audio Capability represents a Local Codec including its preferrable
 *  Quality of service.
 *
 */
struct bt_audio_capability {
	/** Capability type */
	uint8_t  type;
	/** Supported Audio Contexts */
	uint16_t context;
	/** Capability codec reference */
	struct bt_codec *codec;
	/** Capability preferences */
	struct bt_audio_capability_pref pref;
	/** Capability operations reference */
	struct bt_audio_capability_ops *ops;
	sys_snode_t node;
};

/** @brief Register Audio Capability.
 *
 *  Register Audio Local Capability.
 *
 *  @param cap Capability structure.
 *
 *  @return 0 in case of success or negative value in case of error.
 */
int bt_audio_capability_register(struct bt_audio_capability *cap);

/** @brief Unregister Audio Capability.
 *
 *  Unregister Audio Local Capability.
 *
 *  @param cap Capability structure.
 *
 *  @return 0 in case of success or negative value in case of error.
 */
int bt_audio_capability_unregister(struct bt_audio_capability *cap);

/** @brief Set the location for an endpoint type
 *
 * @param type     Type of the endpoint.
 * @param location The location to be set.
 *
 */
int bt_audio_capability_set_location(enum bt_audio_pac_type type,
				     enum bt_audio_location location);

#ifdef __cplusplus
}
#endif

#endif /* ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_CAPABILITIES_H_ */
