/******************************************************************************
 *
 *  Copyright 2021 The Android Open Source Project
 *
 *  Licensed 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 BTIF_ACM_H
#define BTIF_ACM_H

#include <vector>

//#include "bta_acm_api.h"
#include "btif_common.h"
#include "bta_bap_uclient_api.h"
#include "bta_pacs_client_api.h"
#include "bta_ascs_client_api.h"

typedef uint8_t tBTA_ACM_HNDL;
typedef uint8_t tBTIF_ACM_STATUS;

#define BTA_ACM_MAX_EVT 26
#define BTA_ACM_NUM_STRS 6
#define BTA_ACM_NUM_CIGS 239
//starting setid from 16 onwards as 16 is inavlid
#define BTA_ACM_MIN_NUM_SETID 17
#define BTA_ACM_MAX_NUM_SETID 255
#define CONTEXT_TYPE_UNKNOWN 0
#define CONTEXT_TYPE_MUSIC 1
#define CONTEXT_TYPE_VOICE 2
#define CONTEXT_TYPE_MUSIC_VOICE 3

#define BTA_ACM_DISCONNECT_EVT 0
#define BTA_ACM_CONNECT_EVT 1
#define BTA_ACM_START_EVT 2
#define BTA_ACM_STOP_EVT 3
#define BTA_ACM_RECONFIG_EVT 4
#define BTA_ACM_CONFIG_EVT 5
#define BTA_ACM_CONN_UPDATE_TIMEOUT_EVT 6

#define BTA_ACM_INITIATOR_SERVICE_ID 0xFF
#define ACM_UUID 0xFFFF
#define ACM_TSEP_SNK 1

#define SRC 0
#define SNK 1

constexpr uint8_t  STREAM_STATE_DISCONNECTED     = 0x00;
constexpr uint8_t  STREAM_STATE_CONNECTING       = 0x01;
constexpr uint8_t  STREAM_STATE_CONNECTED        = 0x02;
constexpr uint8_t  STREAM_STATE_STARTING         = 0x03;
constexpr uint8_t  STREAM_STATE_STREAMING        = 0x04;
constexpr uint8_t  STREAM_STATE_STOPPING         = 0x05;
constexpr uint8_t  STREAM_STATE_DISCONNECTING    = 0x06;
constexpr uint8_t  STREAM_STATE_RECONFIGURING    = 0x07;

using bluetooth::bap::ucast::StreamStateInfo;
using bluetooth::bap::ucast::StreamConfigInfo;

using bluetooth::bap::ucast::StreamConnect;
using bluetooth::bap::ucast::StreamType;
using bluetooth::bap::ucast::StreamReconfig;
using bluetooth::bap::ucast::StreamDiscReason;
using bluetooth::bap::ucast::StreamState;
using bluetooth::bap::ucast::QosConfig;

using bluetooth::bap::pacs::CodecConfig;

typedef struct {
  RawAddress bd_addr;
  int contextType;
  int profileType;
}tBTIF_ACM_CONN_DISC;

typedef struct {
  RawAddress bd_addr;
}tBTA_ACM_CONN_UPDATE_TIMEOUT_INFO;

typedef struct {
  RawAddress bd_addr;
  StreamType stream_type;
  CodecConfig codec_config;
  uint32_t audio_location;
  QosConfig qos_config;
  std::vector<CodecConfig> codecs_selectable;
}tBTA_ACM_CONFIG_INFO;

typedef struct {
  RawAddress bd_addr;
  StreamType stream_type;
  StreamState stream_state;
  StreamDiscReason reason;
}tBTA_ACM_STATE_INFO;

typedef struct {
  RawAddress bd_addr;
  bool is_direct;
  StreamStateInfo streams_info;
}tBTIF_ACM_CONNECT;

typedef struct {
  RawAddress bd_addr;
  StreamStateInfo streams_info;
}tBTIF_ACM_DISCONNECT;

typedef struct {
  RawAddress bd_addr;
  StreamStateInfo streams_info;
}tBTIF_ACM_START;

typedef struct {
  RawAddress bd_addr;
  StreamStateInfo streams_info;
}tBTIF_ACM_STOP;

typedef struct {
  RawAddress bd_addr;
  StreamReconfig streams_info;
}tBTIF_ACM_RECONFIG;

typedef union {
  tBTIF_ACM_CONN_DISC acm_conn_disc;
  tBTA_ACM_STATE_INFO state_info;
  tBTA_ACM_CONFIG_INFO config_info;
  tBTIF_ACM_CONNECT acm_connect;
  tBTIF_ACM_DISCONNECT acm_disconnect;
  tBTIF_ACM_START acm_start;
  tBTIF_ACM_STOP acm_stop;
  tBTIF_ACM_RECONFIG acm_reconfig;
}tBTIF_ACM;

typedef enum {
  /* Reuse BTA_ACM_XXX_EVT - No need to redefine them here */
  BTIF_ACM_CONNECT_REQ_EVT = BTA_ACM_MAX_EVT,
  BTIF_ACM_DISCONNECT_REQ_EVT,
  BTIF_ACM_START_STREAM_REQ_EVT,
  BTIF_ACM_STOP_STREAM_REQ_EVT,
  BTIF_ACM_SUSPEND_STREAM_REQ_EVT,
  BTIF_ACM_RECONFIG_REQ_EVT,
} btif_acm_sm_event_t;

typedef enum {
  BTA_CSIP_NEW_SET_FOUND_EVT = 1,
  BTA_CSIP_SET_MEMBER_FOUND_EVT,
  BTA_CSIP_CONN_STATE_CHG_EVT,
  BTA_CSIP_LOCK_STATUS_CHANGED_EVT,
  BTA_CSIP_LOCK_AVAILABLE_EVT,
  BTA_CSIP_SET_SIZE_CHANGED,
  BTA_CSIP_SET_SIRK_CHANGED,
} btif_csip_sm_event_t;

/**
 * When the local device is ACM source, get the address of the active peer.
 */
RawAddress btif_acm_source_active_peer(void);

/**
 * When the local device is ACM sink, get the address of the active peer.
 */
RawAddress btif_acm_sink_active_peer(void);

/**
 * Start streaming.
 */
void btif_acm_stream_start(void);

/**
 * Stop streaming.
 *
 * @param peer_address the peer address or RawAddress::kEmpty to stop all peers
 */
void btif_acm_stream_stop(void);

/**
 * Suspend streaming.
 */
void btif_acm_stream_suspend(void);

/**
 * Start offload streaming.
 */
void btif_acm_stream_start_offload(void);

bool btif_acm_check_if_requested_devices_stopped(void);

/**
 * Get the Stream Endpoint Type of the Active peer.
 *
 * @return the stream endpoint type: either AVDT_TSEP_SRC or AVDT_TSEP_SNK
 */
uint8_t btif_acm_get_peer_sep(void);

/**

 * Report ACM Source Codec State for a peer.
 *
 * @param peer_address the address of the peer to report
 * @param codec_config the codec config to report
 * @param codecs_local_capabilities the codecs local capabilities to report
 * @param codecs_selectable_capabilities the codecs selectable capabilities
 * to report
 */
void btif_acm_report_source_codec_state(
    const RawAddress& peer_address,
    const CodecConfig& codec_config,
    const std::vector<CodecConfig>& codecs_local_capabilities,
    const std::vector<CodecConfig>&
        codecs_selectable_capabilities, int contextType);

/**
 * Initialize / shut down the ACM Initiator service.
 *
 * @param enable true to enable the ACM Source service, false to disable it
 * @return BT_STATUS_SUCCESS on success, BT_STATUS_FAIL otherwise
 */
bt_status_t btif_acm_initiator_execute_service(bool enable);

/**
 * Dump debug-related information for the BTIF ACM module.
 *
 * @param fd the file descriptor to use for writing the ASCII formatted
 * information
 */
void btif_debug_acm_dump(int fd);

bool btif_acm_is_active();
uint16_t btif_acm_get_sample_rate();
uint8_t btif_acm_get_ch_mode();
uint32_t btif_acm_get_bitrate();
uint32_t btif_acm_get_octets(uint32_t bit_rate);
uint16_t btif_acm_get_framelength();
uint8_t btif_acm_get_ch_count();
uint16_t btif_acm_get_current_active_profile();
bool btif_acm_is_codec_type_lc3q();
uint8_t btif_acm_lc3q_ver();
bool btif_acm_is_call_active(void);

#endif /* BTIF_ACM_H */
