/***************************************************************************
 *
 * 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_ibrt_ui.h"
#include "factory_section.h"
#include "app_ibrt_if.h"
#include "nvrecord.h"
#include "nvrecord_env.h"
#include "app_ibrt_nvrecord.h"
#include "ddbif.h"

/*****************************************************************************

Prototype    : app_ibrt_ui_config_ibrt_info
Description  : app ui init
Input        : void
Output       : None
Return Value :
Calls        :
Called By    :

History        :
Date         : 2019/3/29
Author       : bestechnic
Modification : Created function

*****************************************************************************/
void app_ibrt_nvrecord_config_load(void *config)
{
    struct nvrecord_env_t *nvrecord_env;
    ibrt_config_t *ibrt_config = (ibrt_config_t *)config;
    //factory_section_original_btaddr_get(ibrt_config->local_addr.address);
    nv_record_env_get(&nvrecord_env);
    if(nvrecord_env->ibrt_mode.mode!=IBRT_UNKNOW)
    {
        ibrt_config->nv_role=nvrecord_env->ibrt_mode.mode;
        ibrt_config->peer_addr=nvrecord_env->ibrt_mode.record.bdAddr;
        ibrt_config->local_addr=nvrecord_env->ibrt_mode.record.bdAddr;
        if(nvrecord_env->ibrt_mode.tws_connect_success == 0)
        {
            app_ibrt_ui_clear_tws_connect_success_last();
        }
        else
        {
            app_ibrt_ui_set_tws_connect_success_last();
        }
    }
    else
    {
        ibrt_config->nv_role=IBRT_UNKNOW;
    }
}
/*****************************************************************************

Prototype    : app_ibrt_ui_config_ibrt_info
Description  : app ui init
Input        : void
Output       : None
Return Value :
Calls        :
Called By    :

History        :
Date         : 2019/3/29
Author       : bestechnic
Modification : Created function

*****************************************************************************/
int app_ibrt_nvrecord_find(const bt_bdaddr_t *bd_ddr, nvrec_btdevicerecord **record)
{
    return nv_record_btdevicerecord_find(bd_ddr, record);
}
/*****************************************************************************

Prototype    : app_ibrt_nvrecord_update_ibrt_mode_tws
Description  : app_ibrt_nvrecord_update_ibrt_mode_tws
Input        : status
Output       : None
Return Value :
Calls        :
Called By    :

History        :
Date         : 2019/3/29
Author       : bestechnic
Modification : Created function

*****************************************************************************/
void app_ibrt_nvrecord_update_ibrt_mode_tws(bool status)
{
    struct nvrecord_env_t *nvrecord_env;
    
    TRACE(2,"##%s,%d",__func__,status);
    nv_record_env_get(&nvrecord_env);
    nvrecord_env->ibrt_mode.tws_connect_success = status;
    nv_record_env_set(nvrecord_env);

}
/*****************************************************************************
 Prototype    : app_ibrt_nvrecord_get_latest_mobiles_addr
 Description  : get latest mobile addr from nv
 Input        : bt_bdaddr_t *mobile_addr
 Output       : None
 Return Value :
 Calls        :
 Called By    :

 History        :
 Date         : 2019/4/25
 Author       : bestechnic
 Modification : Created function

*****************************************************************************/
int app_ibrt_nvrecord_get_latest_mobiles_addr(bt_bdaddr_t *mobile_addr1, bt_bdaddr_t* mobile_addr2)
{
    btif_device_record_t record;
    int found_mobile_addr_count = 0;
    int paired_dev_count = nv_record_get_paired_dev_count();

    /* the tail is latest, the head is oldest */
    for (int i = paired_dev_count - 1; i >= 0; --i)
    {
        if (BT_STS_SUCCESS != nv_record_enum_dev_records(i, &record))
        {
            break;
        }

        if (MOBILE_LINK == app_tws_ibrt_get_link_type_by_addr(&record.bdAddr))
        {
            found_mobile_addr_count += 1;

            if (found_mobile_addr_count == 1)
            {
                *mobile_addr1 = record.bdAddr;
            }
            else if (found_mobile_addr_count == 2)
            {
                *mobile_addr2 = record.bdAddr;
                break;
            }
        }
    }

    return found_mobile_addr_count;
}

int app_ibrt_nvrecord_choice_mobile_addr(bt_bdaddr_t *mobile_addr, uint8_t index)
{
    btif_device_record_t record;
    int paired_dev_count = nv_record_get_paired_dev_count();
    int mobile_found_count = 0;
    if (paired_dev_count < index + 1)
    {
        return 0;
    }

    /* the tail is latest, the head is oldest */
    for (int i = paired_dev_count - 1; i >= 0; --i)
    {
        if (BT_STS_SUCCESS != nv_record_enum_dev_records(i, &record))
        {
            break;
        }

        if (MOBILE_LINK == app_tws_ibrt_get_link_type_by_addr(&record.bdAddr))
        {
            if (mobile_found_count == index)
            {
                *mobile_addr = record.bdAddr;
                return 1;
            }

            mobile_found_count += 1;   
        }
    }

    return 0;
}
/*****************************************************************************
 Prototype    : app_ibrt_nvrecord_get_mobile_addr
 Description  : get mobile addr from nv
 Input        : bt_bdaddr_t *mobile_addr
 Output       : None
 Return Value :
 Calls        :
 Called By    :

 History        :
 Date         : 2019/4/25
 Author       : bestechnic
 Modification : Created function

*****************************************************************************/
bt_status_t app_ibrt_nvrecord_get_mobile_addr(bt_bdaddr_t *mobile_addr)
{
#if !defined(FPGA)
    btif_device_record_t record1;
    btif_device_record_t record2;
    btif_device_record_t record;
    ibrt_link_type_e link_type;

    uint8_t null_addr[6] = {0};
    ibrt_ctrl_t *p_ibrt_ctrl = app_tws_ibrt_get_bt_ctrl_ctx();
    int record_num = nv_record_enum_latest_two_paired_dev(&record1, &record2);

    if (memcmp(&p_ibrt_ctrl->mobile_addr.address[0], &null_addr[0], BTIF_BD_ADDR_SIZE) &&
        (ddbif_find_record((const bt_bdaddr_t *)&p_ibrt_ctrl->mobile_addr, &record) == BT_STS_SUCCESS))
    {
        //first check if mobile addr exist in RAM
        *mobile_addr = p_ibrt_ctrl->mobile_addr;
        return BT_STS_SUCCESS;
    }

    if ((record_num == 1) || (record_num == 2))
    {
        //check nv mobile addr
        link_type = app_tws_ibrt_get_link_type_by_addr(&record1.bdAddr);
        if (link_type == MOBILE_LINK)
        {
            *mobile_addr = record1.bdAddr;
            return BT_STS_SUCCESS;
        }
        else if (record_num == 2)
        {
            link_type = app_tws_ibrt_get_link_type_by_addr(&record2.bdAddr);
            if (link_type == MOBILE_LINK)
            {
                *mobile_addr = record2.bdAddr;
                return BT_STS_SUCCESS;
            }
        }
    }
#else
#if 0//for fpga test reconnect phone
    ibrt_ctrl_t *p_ibrt_ctrl = app_tws_ibrt_get_bt_ctrl_ctx();

    uint8_t nv_slave_connect_addr[] = {0xaf,0x55,0x68,0x68,0x76,0x7c};//huawei
    //uint8_t nv_slave_connect_addr[] = {0x62, 0xb2, 0x60, 0x37, 0xab, 0x20};//LJH iphone
    memcpy(mobile_addr, &nv_slave_connect_addr[0], BTIF_BD_ADDR_SIZE);

    if (p_ibrt_ctrl->nv_role == IBRT_SLAVE)
    {
        return BT_STS_SUCCESS;
    }
#endif
#endif
    return BT_STS_FAILED;
}
/*****************************************************************************
 Prototype    : app_ibrt_nvrecord_delete_all_mobile_record
 Description  : app_ibrt_nvrecord_delete_all_mobile_record
 Input        : None
 Output       : None
 Return Value :
 Calls        :
 Called By    :

 History        :
 Date         : 2019/4/25
 Author       : bestechnic
 Modification : Created function

*****************************************************************************/
void app_ibrt_nvrecord_delete_all_mobile_record(void)
{
    btif_device_record_t record = {0};
    int paired_dev_count = nv_record_get_paired_dev_count();

    for (int i = paired_dev_count - 1; i >= 0; --i)
    {
        nv_record_enum_dev_records(i, &record);

        if (MOBILE_LINK == app_tws_ibrt_get_link_type_by_addr(&record.bdAddr))
        {
            nv_record_ddbrec_delete(&record.bdAddr);
        }
    }
    app_ibrt_if_config_keeper_clear();
}

/*****************************************************************************
 Prototype    : app_ibrt_nvrecord_rebuild
 Description  : app_ibrt_nvrecord_rebuild
 Input        : None
 Output       : None
 Return Value :
 Calls        :
 Called By    :

 History        :
 Date         : 2019/4/25
 Author       : bestechnic
 Modification : Created function

*****************************************************************************/
void app_ibrt_nvrecord_rebuild(void)
{
    struct nvrecord_env_t *nvrecord_env;
    nv_record_env_get(&nvrecord_env);

    nv_record_sector_clear();
    nv_record_env_init();
    nv_record_update_factory_tester_status(NVRAM_ENV_FACTORY_TESTER_STATUS_DEFAULT);
    nv_record_env_set(nvrecord_env);
    nv_record_flash_flush();
    app_ibrt_if_config_keeper_clear();
    app_ibrt_ui_reboot_sdk();
}

