/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

#ifndef H_BLE_AUDIO_SVC_PACS_
#define H_BLE_AUDIO_SVC_PACS_

/**
 * @file ble_audio_svc_pacs.h
 *
 * @brief Bluetooth LE Audio PAC Service
 *
 * This header file provides the public API for interacting with the PACS package.
 *
 * @defgroup ble_audio_svc_pacs Bluetooth LE Audio PACS package
 * @ingroup bt_host
 * @{
 *
 * This package is used to setup PACS for codecs registered with ble_audio_codec.
 * To register a codec create it's definition as `ble_audio_codec_record` structure and register it
 * using `ble_audio_codec_register()`. Up to BLE_AUDIO_MAX_CODEC_RECORDS entries may be registered.
 * Registering and unregistering codecs, as well as setting PACS parameters will trigger sending
 * notifications, if their support is enabled (see pacs/syscfg.yml).
 *
 */

/** BLE Audio Published Audio Capabilities Service UUID */
#define BLE_SVC_AUDIO_PACS_UUID16                                   0x1850

/** BLE Audio Published Audio Capabilities Service Sink PAC characteristic UUID */
#define BLE_SVC_AUDIO_PACS_CHR_UUID16_SINK_PAC                      0x2BC9

/** BLE Audio Published Audio Capabilities Service Sink Audio Locations characteristic UUID */
#define BLE_SVC_AUDIO_PACS_CHR_UUID16_SINK_AUDIO_LOCATIONS          0x2BCA

/** BLE Audio Published Audio Capabilities Service Source PAC characteristic UUID */
#define BLE_SVC_AUDIO_PACS_CHR_UUID16_SOURCE_PAC                    0x2BCB

/** BLE Audio Published Audio Capabilities Service Source Audio Locations characteristic UUID */
#define BLE_SVC_AUDIO_PACS_CHR_UUID16_SOURCE_AUDIO_LOCATIONS        0x2BCC

/** BLE Audio Published Audio Capabilities Service Available Audio Contexts characteristic UUID */
#define BLE_SVC_AUDIO_PACS_CHR_UUID16_AVAILABLE_AUDIO_CONTEXTS      0x2BCD

/** BLE Audio Published Audio Capabilities Service Supported Audio Contexts characteristic UUID */
#define BLE_SVC_AUDIO_PACS_CHR_UUID16_SUPPORTED_AUDIO_CONTEXTS      0x2BCE

/** Parameters used for setting supported Audio Locations and Contexts. */
struct ble_svc_audio_pacs_set_param {
    /** Supported Audio Locations */
    uint32_t audio_locations;

    /** Supported Contexts */
    uint16_t supported_contexts;
};

/**
 * @brief Set PACS params.
 *
 * Set device capabilities reported in Published Audio Capabilities Service.
 *
 * @param[in] flags                     Flags that define if capabilities being set are for
 *                                      Sink or Source. Valid values are either
 *                                      `BLE_AUDIO_CODEC_FLAG_SOURCE` or `BLE_AUDIO_CODEC_FLAG_SINK`
 * @param[in] param                     Pointer to a `ble_svc_audio_pacs_set_param`
 *                                      structure that defines capabilities supported by
 *                                      device.
 *
 * @return                              0 on success;
 *                                      A non-zero value on failure.
 */
int ble_svc_audio_pacs_set(uint8_t flags, const struct ble_svc_audio_pacs_set_param *param);

/**
 * @brief Set available context types.
 *
 * @param[in] conn_handle               Connection handle identifying connection for which contexts
 *                                      being set
 * @param[in] sink_contexts             Available Sink Contexts
 * @param[in] source_contexts           Available Source Contexts
 *
 * @return                              0 on success;
 *                                      A non-zero value on failure.
 */
int ble_svc_audio_pacs_avail_contexts_set(uint16_t conn_handle,
                                          uint16_t sink_contexts,
                                          uint16_t source_contexts);

/**
 * @}
 */

#endif /* H_BLE_AUDIO_SVC_PACS_ */
