/***************************************************************************
 *
 * 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.
 *
 ****************************************************************************/
#include "string.h"
#include "app_tws_ibrt_trace.h"
#include "app_tws_ctrl_thread.h"
#include "app_tws_ibrt_cmd_handler.h"
#include "app_ibrt_customif_cmd.h"
#include "app_tws_if.h"
#include "app_dip.h"
#ifdef BISTO_ENABLED
#include "gsound_custom.h"
#endif
#ifdef __DUAL_MIC_RECORDING__
#include "ai_control.h"
#include "app_recording_handle.h"
#endif
#include "apps.h"
#if defined(IBRT)
/*
* custom cmd handler add here, this is just a example
*/

#define app_ibrt_custom_cmd_rsp_timeout_handler_null   (0)
#define app_ibrt_custom_cmd_rsp_handler_null           (0)
#define app_ibrt_custom_cmd_rx_handler_null            (0)

#ifdef BISTO_ENABLED
static void app_ibrt_bisto_dip_sync(uint8_t *p_buff, uint16_t length);
static void app_ibrt_bisto_dip_sync_handler(uint16_t rsp_seq, uint8_t *p_buff, uint16_t length);
#endif
#ifdef __DUAL_MIC_RECORDING__
static void app_ibrt_customif_audio_send(uint8_t* p_buff, uint16_t length);
static void app_ibrt_customif_audio_send_done(uint16_t cmdcode, uint16_t rsp_seq, uint8_t *ptrParam, uint16_t paramLen);
static void app_ibrt_customif_audio_send_handler(uint16_t rsp_seq, uint8_t* p_buff, uint16_t length);
#endif
void app_ibrt_customif_test1_cmd_send(uint8_t *p_buff, uint16_t length);
static void app_ibrt_customif_test1_cmd_send_handler(uint16_t rsp_seq, uint8_t *p_buff, uint16_t length);

static void app_ibrt_customif_test2_cmd_send(uint8_t *p_buff, uint16_t length);
static void app_ibrt_customif_test2_cmd_send_handler(uint16_t rsp_seq, uint8_t *p_buff, uint16_t length);
static void app_ibrt_customif_test2_cmd_send_rsp_timeout_handler(uint16_t rsp_seq, uint8_t *p_buff, uint16_t length);
static void app_ibrt_customif_test2_cmd_send_rsp_handler(uint16_t rsp_seq, uint8_t *p_buff, uint16_t length);
static void app_ibrt_customif_test3_cmd_send_handler(uint16_t rsp_seq, uint8_t *p_buff, uint16_t length);

static void app_ibrt_customif_test4_cmd_send_handler(uint16_t rsp_seq, uint8_t *p_buff, uint16_t length);
static const app_tws_cmd_instance_t g_ibrt_custom_cmd_handler_table[]=
{
#ifdef GFPS_ENABLED
    {
        APP_TWS_CMD_SHARE_FASTPAIR_INFO,                "SHARE_FASTPAIR_INFO",
        app_ibrt_share_fastpair_info,
        app_ibrt_shared_fastpair_info_received_handler,  0,
        app_ibrt_custom_cmd_rsp_timeout_handler_null,          app_ibrt_custom_cmd_rsp_handler_null
    },
#endif

#ifdef BISTO_ENABLED
    {
        APP_TWS_CMD_BISTO_DIP_SYNC,                     "BISTO_DIP_SYNC",
        app_ibrt_bisto_dip_sync,
        app_ibrt_bisto_dip_sync_handler,                0,
        app_ibrt_cmd_rsp_timeout_handler_null,          app_ibrt_cmd_rsp_handler_null
    },
#endif
#ifdef __DUAL_MIC_RECORDING__
    {
        APP_IBRT_CUSTOM_CMD_DMA_AUDIO,                          "TWS_CMD_DMA_AUDIO",
        app_ibrt_customif_audio_send,
        app_ibrt_customif_audio_send_handler,               0,
        app_ibrt_custom_cmd_rsp_timeout_handler_null,           app_ibrt_custom_cmd_rsp_handler_null,
        app_ibrt_customif_audio_send_done,
    },
#endif
    {
        APP_IBRT_CUSTOM_CMD_TEST1,                              "TWS_CMD_TEST1",
        app_ibrt_customif_test1_cmd_send,
        app_ibrt_customif_test1_cmd_send_handler,               0,
        app_ibrt_custom_cmd_rsp_timeout_handler_null,           app_ibrt_custom_cmd_rsp_handler_null
    },
    {
        APP_IBRT_CUSTOM_CMD_TEST2,                              "TWS_CMD_TEST2",
        app_ibrt_customif_test2_cmd_send,
        app_ibrt_customif_test2_cmd_send_handler,               RSP_TIMEOUT_DEFAULT,
        app_ibrt_customif_test2_cmd_send_rsp_timeout_handler,   app_ibrt_customif_test2_cmd_send_rsp_handler
    },
    {
        APP_IBRT_CUSTOM_CMD_TEST3,                              "TWS_CMD_TEST3",
        app_ibrt_customif_test3_cmd_send,
        app_ibrt_customif_test3_cmd_send_handler,               0,
        app_ibrt_custom_cmd_rsp_timeout_handler_null,           app_ibrt_custom_cmd_rsp_handler_null
    },
	{
        APP_IBRT_CUSTOM_CMD_TEST4,                              "TWS_CMD_TEST4",
        app_ibrt_customif_test4_cmd_send,
        app_ibrt_customif_test4_cmd_send_handler,               0,
        app_ibrt_custom_cmd_rsp_timeout_handler_null,           app_ibrt_custom_cmd_rsp_handler_null
    },
};

int app_ibrt_customif_cmd_table_get(void **cmd_tbl, uint16_t *cmd_size)
{
    *cmd_tbl = (void *)&g_ibrt_custom_cmd_handler_table;
    *cmd_size = ARRAY_SIZE(g_ibrt_custom_cmd_handler_table);
    return 0;
}


#ifdef BISTO_ENABLED
static void app_ibrt_bisto_dip_sync(uint8_t *p_buff, uint16_t length)
{
    app_ibrt_send_cmd_without_rsp(APP_TWS_CMD_BISTO_DIP_SYNC, p_buff, length);
}

static void app_ibrt_bisto_dip_sync_handler(uint16_t rsp_seq, uint8_t *p_buff, uint16_t length)
{
    gsound_mobile_type_get_callback(*(MOBILE_CONN_TYPE_E *)p_buff);
}
#endif
#ifdef __DUAL_MIC_RECORDING__
static void app_ibrt_customif_audio_send(uint8_t* p_buff, uint16_t length) {
    TRACE(1, "%s", __func__);
    app_recording_send_data_to_master();
}

static void app_ibrt_customif_audio_send_handler(uint16_t rsp_seq, uint8_t* p_buff, uint16_t length) {
    ai_function_handle(CALLBACK_STORE_SLAVE_DATA, (void*)p_buff, length);
    //TRACE(1, "%s", __func__);
}

static void app_ibrt_customif_audio_send_done(uint16_t cmdcode, uint16_t rsp_seq, uint8_t* ptrParam,
        uint16_t paramLen) {
    TRACE(1, "%s", __func__);
    app_recording_audio_send_done();
}
#endif
void app_ibrt_customif_cmd_test(ibrt_custom_cmd_test_t *cmd_test)
{
    tws_ctrl_send_cmd(APP_IBRT_CUSTOM_CMD_TEST1, (uint8_t*)cmd_test, sizeof(ibrt_custom_cmd_test_t));
    tws_ctrl_send_cmd(APP_IBRT_CUSTOM_CMD_TEST2, (uint8_t*)cmd_test, sizeof(ibrt_custom_cmd_test_t));
    tws_ctrl_send_cmd(APP_IBRT_CUSTOM_CMD_TEST3, (uint8_t*)cmd_test, sizeof(ibrt_custom_cmd_test_t));
}

void app_ibrt_customif_test1_cmd_send(uint8_t *p_buff, uint16_t length)
{
    app_ibrt_send_cmd_without_rsp(APP_IBRT_CUSTOM_CMD_TEST1, p_buff, length);
    TRACE(1,"%s", __func__);
}

static void app_ibrt_customif_test1_cmd_send_handler(uint16_t rsp_seq, uint8_t *p_buff, uint16_t length)
{
	TRACE(1,"%s", __func__);
	app_ibrt_search_ui_handle_key((APP_KEY_STATUS *)p_buff, NULL);
}

static void app_ibrt_customif_test2_cmd_send(uint8_t *p_buff, uint16_t length)
{
    TRACE(1,"%s", __func__);
}

static void app_ibrt_customif_test2_cmd_send_handler(uint16_t rsp_seq, uint8_t *p_buff, uint16_t length)
{
    tws_ctrl_send_rsp(APP_IBRT_CUSTOM_CMD_TEST2, rsp_seq, NULL, 0);
    TRACE(1,"%s", __func__);

}

static void app_ibrt_customif_test2_cmd_send_rsp_timeout_handler(uint16_t rsp_seq, uint8_t *p_buff, uint16_t length)
{
    TRACE(1,"%s", __func__);

}

static void app_ibrt_customif_test2_cmd_send_rsp_handler(uint16_t rsp_seq, uint8_t *p_buff, uint16_t length)
{
    TRACE(1,"%s", __func__);
}

void app_ibrt_customif_test3_cmd_send(uint8_t *p_buff, uint16_t length)
{
    app_ibrt_send_cmd_without_rsp(APP_IBRT_CUSTOM_CMD_TEST3, p_buff, length);
    TRACE(1,"%s", __func__);
}

extern void app_ibrt_ui_test_mtu_change_sync_notify(void);
static void app_ibrt_customif_test3_cmd_send_handler(uint16_t rsp_seq, uint8_t *p_buff, uint16_t length)
{
	/*TRACE(3,"%s,latency_mode_is_open = %d", __func__,latency_mode_is_open);
	if(*p_buff == latency_mode_is_open)return;
	if(*p_buff == 0)
		latency_mode_is_open = 1;
	else if(*p_buff == 1)
		latency_mode_is_open = 0;
	app_ibrt_ui_test_mtu_change_sync_notify();*/
}

void app_ibrt_customif_test4_cmd_send(uint8_t *p_buff, uint16_t length)
{
	TRACE(3,"%s", __func__);
	app_ibrt_send_cmd_without_rsp(APP_IBRT_CUSTOM_CMD_TEST4, p_buff, length);
}
extern void app_ibrt_sync_volume_info();
static void app_ibrt_customif_test4_cmd_send_handler(uint16_t rsp_seq, uint8_t *p_buff, uint16_t length)
{
	TRACE(3,"!!!!app_ibrt_customif_test4_cmd_send_handler");
	app_ibrt_sync_volume_info();
}

#ifdef CUSTOM_BITRATE
//#include "product_config.h"
#include "nvrecord_extension.h"
extern void a2dp_avdtpcodec_aac_user_configure(uint32_t bitrate,uint8_t user_configure);
extern void a2dp_avdtpcodec_sbc_user_configure(uint32_t bitpool,uint8_t user_configure);
extern void app_audio_dynamic_update_dest_packet_mtu(uint8_t codec_index, uint8_t packet_mtu, uint8_t user_configure);

void app_ibrt_user_a2dp_info_sync_tws_share_cmd_send(uint8_t *p_buff, uint16_t length)
{
    tws_ctrl_send_cmd(APP_TWS_CMD_A2DP_CONFIG_SYNC, p_buff, length);
}

static void app_ibrt_user_a2dp_info_sync(uint8_t *p_buff, uint16_t length)
{
    if((app_tws_ibrt_mobile_link_connected())){
        app_ibrt_send_cmd_without_rsp(APP_TWS_CMD_A2DP_CONFIG_SYNC, p_buff, length);
    }
}

static void app_ibrt_user_a2dp_info_sync_handler(uint16_t rsp_seq, uint8_t *p_buff, uint16_t length)
{
    ibrt_custome_codec_t *a2dp_user_config_ptr=(ibrt_custome_codec_t *)p_buff;
    TRACE(4,"%s %d %d %d",__func__,a2dp_user_config_ptr->aac_bitrate,a2dp_user_config_ptr->sbc_bitpool,a2dp_user_config_ptr->audio_latentcy);
    if((app_tws_ibrt_slave_ibrt_link_connected())){
        a2dp_avdtpcodec_sbc_user_configure(a2dp_user_config_ptr->sbc_bitpool, true);
        a2dp_avdtpcodec_aac_user_configure(a2dp_user_config_ptr->aac_bitrate, true); 
        app_audio_dynamic_update_dest_packet_mtu(0, (a2dp_user_config_ptr->audio_latentcy-USER_CONFIG_AUDIO_LATENCY_ERROR)/3, true);//sbc
        app_audio_dynamic_update_dest_packet_mtu(1, (a2dp_user_config_ptr->audio_latentcy-USER_CONFIG_AUDIO_LATENCY_ERROR)/23, true);//aac
        uint32_t lock = nv_record_pre_write_operation();
        nv_record_get_extension_entry_ptr()->a2dp_user_info.aac_bitrate = a2dp_user_config_ptr->aac_bitrate;
        nv_record_get_extension_entry_ptr()->a2dp_user_info.sbc_bitpool = a2dp_user_config_ptr->sbc_bitpool;
        nv_record_get_extension_entry_ptr()->a2dp_user_info.audio_latentcy = a2dp_user_config_ptr->audio_latentcy;
        nv_record_post_write_operation(lock);
        nv_record_flash_flush();
    }
}
#endif
#endif
