/***************************************************************************
 *
 * Copyright 2015-2019 BES.
 * All rights reserved. All unpublished rights reserved.
 *
 * No part of this work may be used or reproduced in any form or by any
 * means, or stored in a database or retrieval system, without prior written
 * permission of BES.
 *
 * Use of this work is governed by a license granted by BES.
 * This work contains confidential and proprietary information of
 * BES. which is protected by copyright, trade secret,
 * trademark and other intellectual property rights.
 *
 ****************************************************************************/
#ifndef __APP_BT_H__
#define __APP_BT_H__

#ifdef __cplusplus
extern "C" {
#endif
#include "me_api.h"
#include "a2dp_api.h"
#include "hfp_api.h"

enum APP_BT_REQ_T {
    APP_BT_REQ_ACCESS_MODE_SET,
    APP_BT_REQ_AUTO_TEST,
    APP_BT_REQ_NUM
};

enum APP_BT_GOLBAL_HANDLE_HOOK_USER_T {
    APP_BT_GOLBAL_HANDLE_HOOK_USER_0 = 0,
    APP_BT_GOLBAL_HANDLE_HOOK_USER_1,
    APP_BT_GOLBAL_HANDLE_HOOK_USER_QTY
};

typedef void (*APP_BT_REQ_CONNECT_PROFILE_FN_T)(void *, void *);
typedef bt_status_t  (*APP_BT_REQ_HF_OP_FN_T)(void *);
typedef void (*APP_BT_GOLBAL_HANDLE_HOOK_HANDLER)(const btif_event_t*Event);
typedef void (*APP_APPTHREAD_REQ_CUSTOMER_CALL_FN_T)(void *, void *);

#define app_bt_accessmode_set_req(accmode) do{app_bt_send_request(APP_BT_REQ_ACCESS_MODE_SET, accmode, 0, 0);}while(0)
typedef enum
{
    APP_BT_IDLE_STATE = 0,
    APP_BT_IN_CONNECTING_PROFILES_STATE	// acl link is created and in the process of connecting profiles
} APP_BT_CONNECTING_STATE_E;

typedef enum
{
    // always in active mode during a2dp streaming
    ACTIVE_MODE_KEEPER_A2DP_STREAMING = 0,
    // always in active mode during ai voice up-streaming
    ACTIVE_MODE_KEEPER_AI_VOICE_STREAM,
    // always in active mode during OTA
    ACTIVE_MODE_KEEPER_OTA,
    // stay in active mode for 15 seconds after role switch
    ACTIVE_MODE_KEEPER_ROLE_SWITCH,
    // stay in active mode during synchronous voice prompt playing
    ACTIVE_MODE_KEEPER_SYNC_VOICE_PROMPT,
    // always in active mode during phone call
    ACTIVE_MODE_KEEPEER_SCO_STREAMING,


} BT_LINK_ACTIVE_MODE_KEEPER_USER_E;

#define MAX_ACTIVE_MODE_MANAGED_LINKS       3  
#define UPDATE_ACTIVE_MODE_FOR_ALL_LINKS    MAX_ACTIVE_MODE_MANAGED_LINKS

void app_bt_active_mode_manager_init(void);

void app_bt_active_mode_reset(uint32_t linkIndex);

void app_bt_active_mode_set(BT_LINK_ACTIVE_MODE_KEEPER_USER_E user, uint32_t linkIndex);

void app_bt_active_mode_clear(BT_LINK_ACTIVE_MODE_KEEPER_USER_E user, uint32_t linkIndex);

void app_bt_global_handle(const btif_event_t *Event);
bool is_app_bt_pairing_running(void);

void PairingTransferToConnectable(void);

void app_bt_global_handle_init(void);

void app_bt_opening_reconnect(void);

void app_bt_accessmode_set(  btif_accessible_mode_t mode);

void app_bt_send_request(uint32_t message_id, uint32_t param0, uint32_t param1, uint32_t ptr);

void app_bt_init(void);

int app_bt_state_checker(void);

void *app_bt_profile_active_store_ptr_get(uint8_t *bdAddr);

void app_bt_profile_connect_manager_open(void);

void app_bt_profile_connect_manager_opening_reconnect(void);

BOOL app_bt_profile_connect_openreconnecting(void *ptr);

int app_bt_global_handle_hook_set(enum APP_BT_GOLBAL_HANDLE_HOOK_USER_T user, APP_BT_GOLBAL_HANDLE_HOOK_HANDLER handler);

APP_BT_GOLBAL_HANDLE_HOOK_HANDLER app_bt_global_handle_hook_get(enum APP_BT_GOLBAL_HANDLE_HOOK_USER_T user);

bool app_is_hfp_service_connected(void);
#if defined(IBRT)
void app_bt_ibrt_reconnect_mobile_profile_flag_set(void);
void app_bt_ibrt_reconnect_mobile_profile_flag_clear(void);
bool app_bt_ibrt_reconnect_mobile_profile_flag_get(void);
#endif
#if defined(__BT_SELECT_PROF_DEVICE_ID__)
int8_t app_bt_a2dp_is_same_stream(a2dp_stream_t *src_Stream, a2dp_stream_t *dst_Stream);

void app_bt_a2dp_find_same_unused_stream(a2dp_stream_t *in_Stream, a2dp_stream_t **out_Stream, uint32_t device_id);

int8_t app_bt_a2dp_is_stream_on_device_id(a2dp_stream_t *in_Stream, uint32_t device_id);

int8_t app_bt_hfp_is_chan_on_device_id(hf_chan_handle_t chan, uint32_t device_id);

int8_t app_bt_is_any_profile_connected(uint32_t device_id);

int8_t app_bt_is_a2dp_connected(uint32_t device_id);

btif_remote_device_t *app_bt_get_connected_profile_remdev(uint32_t device_id);
#endif

void app_bt_stay_active(uint8_t deviceId);

void app_bt_allow_sniff(uint8_t deviceId);

btif_remote_device_t* app_bt_get_remoteDev(uint8_t deviceId);

void app_bt_stop_sniff(uint8_t deviceId);

void app_bt_sniff_config(btif_remote_device_t *remDev);

void app_bt_allow_sniff_rem_dev(btif_remote_device_t* pRemDev);

void app_bt_stay_active_rem_dev(btif_remote_device_t* pRemDev);

void app_check_pending_stop_sniff_op(void);

void app_bt_reset_reconnect_timer(bt_bdaddr_t *pBdAddr);

uint8_t app_bt_get_num_of_connected_dev(void);

bool btapp_hfp_is_dev_call_active(uint8_t devId);

void app_bt_pause_media_player_again(uint8_t deviceId);

bool app_bt_is_music_player_working(uint8_t deviceId);

bool app_bt_pause_music_player(uint8_t deviceId);

void app_bt_resume_music_player(uint8_t deviceId);

bool app_bt_is_to_resume_music_player(uint8_t deviceId);

void app_bt_reset_music_player_resume_state(void);

bool app_bt_is_device_connected(uint8_t deviceId);

void app_bt_set_music_player_resume_device(uint8_t deviceId);

bool app_bt_is_a2dp_streaming(uint8_t deviceId);

void app_bt_suspend_a2dp_streaming(uint8_t deviceId);

bool app_bt_get_device_bdaddr(uint8_t deviceId, uint8_t* btAddr);

void fast_pair_enter_pairing_mode_handler(void);

void app_hfp_start_voice_media(uint8_t devId);

void app_hfp_resume_pending_voice_media(void);

bool app_hfp_is_starting_media_pending(void);

bool app_bt_is_in_reconnecting(void);

bool btapp_hfp_is_dev_sco_connected(uint8_t devId);

uint8_t a2dp_get_latest_paused_device(void);

bool app_bt_is_in_connecting_profiles_state(void);

void app_bt_clear_connecting_profiles_state(uint8_t devId);

void app_bt_set_connecting_profiles_state(uint8_t devId);

void app_a2dp_hold_mute();

void app_a2dp_unhold_mute();

void app_bt_set_mobile_a2dp_stream(uint32_t deviceId,a2dp_stream_t *stream);

#if defined(__INTERCONNECTION__)
btif_accessible_mode_t app_bt_get_current_access_mode(void);

bool app_bt_is_connected();
#endif
bool app_device_bt_is_connected();
bool app_bt_is_hfp_audio_on(void);

btif_remote_device_t* app_bt_get_connected_mobile_device_ptr(void);
void app_bt_set_spp_device_ptr(btif_remote_device_t* device);
btif_remote_device_t* app_bt_get_spp_device_ptr(void);

bool app_is_disconnecting_all_bt_connections(void);

void app_set_disconnecting_all_bt_connections(bool isEnable);

void app_bt_start_search(void);

#if defined(IBRT)
#if defined(ENHANCED_STACK)
uint32_t app_bt_save_a2dp_app_ctx(btif_remote_device_t *rem_dev, uint8_t *buf, uint32_t buf_len);
uint32_t app_bt_restore_a2dp_app_ctx(uint8_t *buf, uint32_t buf_len);
uint32_t app_bt_save_avrcp_app_ctx(btif_remote_device_t *rem_dev, uint8_t *buf, uint32_t buf_len);
uint32_t app_bt_restore_avrcp_app_ctx(uint8_t *buf, uint32_t buf_len);
uint32_t app_bt_save_hfp_app_ctx(btif_remote_device_t *rem_dev, uint8_t *buf, uint32_t buf_len);
uint32_t app_bt_restore_hfp_app_ctx(uint8_t *buf, uint32_t buf_len);
uint32_t app_bt_save_spp_app_ctx(uint32_t app_id,btif_remote_device_t *rem_dev, uint8_t *buf, uint32_t buf_len);
uint32_t app_bt_restore_spp_app_ctx(uint8_t *buf, uint32_t buf_len, uint32_t app_id);
#ifdef __BTMAP_ENABLE__
uint32_t app_bt_save_map_app_ctx(btif_remote_device_t *rem_dev, uint8_t *buf, uint32_t buf_len);
uint32_t app_bt_restore_map_app_ctx(uint8_t *buf, uint32_t buf_len);
#endif
uint32_t app_bt_restore_hid_app_ctx(uint8_t *buf);
uint32_t app_bt_save_hid_app_ctx(uint8_t *buf);
#endif /* ENHANCED_STACK */
#endif

void app_stop_fast_connectable_ble_adv_timer(void);
int8_t app_bt_get_rssi(void);

#ifdef  TILE_DATAPATH
int8_t app_tile_get_ble_rssi(void);
#endif
void app_bt_prepare_for_ota(void);
void hfp_reconnecting_timer_stop_callback(const btif_event_t *event);
int app_bt_start_custom_function_in_app_thread(
                                    uint32_t param0, uint32_t param1, uint32_t funcPtr);
uint8_t app_bt_get_a2dp_state();

#ifdef __cplusplus
}
#endif
#endif /* BESBT_H */
