/***************************************************************************
 *
 * 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 _ANCC_H_
#define _ANCC_H_

/**
 ****************************************************************************************
 * @addtogroup ANCC.
 * @ingroup ANC
 * @brief ANCS - Client Role.
 * @{
 ****************************************************************************************
 */

/*
 * INCLUDE FILES
 ****************************************************************************************
 */

#include "anc_common.h"

#if (BLE_ANC_CLIENT)

#include "ke_task.h"
#include "prf_types.h"
#include "prf_utils.h"
#include "prf_utils_128.h"

/*
 * DEFINES
 ****************************************************************************************
 */

/// Maximum number of ANCC task instances
#define ANCC_IDX_MAX        (BLE_CONNECTION_MAX)

/// Possible states of the ancc task
enum ancc_states
{
    /// Idle state
    ANCC_FREE,
    /// Connected state
    ANCC_IDLE,
    /// Discovery
    ANCC_DISCOVERING,

    /// Number of defined states.
    ANCC_STATE_MAX
};

/*
 * ENUMERATIONS
 ****************************************************************************************
 */

/// ANCS Characteristics
enum ancc_anc_chars
{
    /// Notification Source
    ANCC_CHAR_NTF_SRC,
    /// Control Point
    ANCC_CHAR_CTRL_PT,
    /// Data Source
    ANCC_CHAR_DATA_SRC,

    ANCC_CHAR_MAX,
};

/// ANCS Characteristic Descriptors
enum ancc_anc_descs
{
    /// Notification Source - Client Characteristic Configuration
    ANCC_DESC_NTF_SRC_CL_CFG,
    /// Data Source - Client Characteristic Configuration
    ANCC_DESC_DATA_SRC_CL_CFG,

    ANCC_DESC_MAX,

    ANCC_DESC_MASK = 0x10,
};

/// Pointer to the connection clean-up function
#define ANCC_CLEANUP_FNCT        (ancc_cleanup)
/*
 * STRUCTURES
 ****************************************************************************************
 */

/**
 * Structure containing the characteristics handles, value handles and descriptors for
 * the Alert Notification Service
 */
struct ancc_anc_content
{
    /// Service info
    struct prf_svc svc;

    /// Characteristic info:
    ///  - Notification Source
    ///  - Control Point
    ///  - Data Source
    struct prf_char_inf chars[ANCC_CHAR_MAX];

    /// Descriptor handles:
    ///  - Notification Source Client Char Cfg
    ///  - Data Source Client Char Cfg
    struct prf_char_desc_inf descs[ANCC_DESC_MAX];
};

struct ancc_cnx_env
{
    /// Current Operation
    void *operation;

    /// Provide an indication about the last operation
    uint16_t last_req;
    /// Last characteristic code discovered
    uint8_t last_char_code;
    /// Counter used to check service uniqueness
    uint8_t nb_svc;

    /// ANCS Characteristics
    struct ancc_anc_content anc;
};

/// ANCS Client environment variable
struct ancc_env_tag
{
    /// profile environment
    prf_env_t prf_env;

    // TODO(jkessinger): Is this safe? Reliable? WTF?
    uint16_t last_write_handle[ANCC_IDX_MAX];
    /// Environment variable pointer for each connections
    struct ancc_cnx_env* env[ANCC_IDX_MAX];
    /// State of different task instances
    ke_state_t state[ANCC_IDX_MAX];
};

/*
 * GLOBAL VARIABLE DEFINITIONS
 ****************************************************************************************
 */

/**
 ****************************************************************************************
 * @brief Retrieve ANCS client profile interface
 *
 * @return ANCS client profile interface
 ****************************************************************************************
 */
const struct prf_task_cbs* ancc_prf_itf_get(void);
void ancc_enable_rsp_send(struct ancc_env_tag *ancc_env, uint8_t conidx, uint8_t status);
void ancc_task_init(struct ke_task_desc *task_desc);

#endif //(BLE_ANC_CLIENT)

/// @} ANCC

#endif //(_ANCC_H_)