/*
 * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#pragma once

#include <stdbool.h>
#include <stdint.h>
#include "hal/ieee802154_ll.h"
#include "esp_ieee802154_frame.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief The PAN information base(PIB) of IEEE802154 radio.
 */
typedef struct {
    bool auto_ack_tx;                                                               /*!< A flag indicates auto-tx ack mode is enabled or not */
    bool auto_ack_rx;                                                               /*!< A flag indicates auto-rx ack mode is enabled or not */
    bool enhance_ack_tx;                                                            /*!< A flag indicates enh-ack timing mode is enabled or not */
    bool promiscuous;                                                               /*!< A flag indicates promiscuous mode is enabled or not */
    bool coordinator;                                                               /*!< A flag indicates the device is coordinator or not*/
    bool rx_when_idle;                                                              /*!< A flag indicates the device is rx on when idle or not */
    int8_t txpower;                                                                 /*!< Tx power configuration */
    uint8_t channel;                                                                /*!< Channel configuration  */
    ieee802154_ll_pending_mode_t pending_mode;                                         /*!< Pending mode configuration  */
    int8_t cca_threshold;                                                           /*!< CCA threshold */
    ieee802154_ll_cca_mode_t cca_mode;                                                 /*!< CCA mode */
} ieee802154_pib_t;

/**
 * @brief  Initialize the PAN information base(PIB) of IEEE802154 radio.
 *
 */
void ieee802154_pib_init(void);

/**
 * @brief  Update the PAN information base(PIB) of IEEE802154 radio.
 *
 */
void ieee802154_pib_update(void);

/**
 * @brief  Get the state of PIB, if is pending, the PIB should be updated to hardware.
 *
 * @return
 *        - True if the PIB is pending, otherwise false.
 */
bool ieee802154_pib_is_pending(void);

/**
 * @brief  Set a specific channel to the PIB.
 *
 * @param[in]  channel  The channel.
 *
 */
void ieee802154_pib_set_channel(uint8_t channel);

/**
 * @brief  Get the channel from the PIB.
 *
 * @return
 *        - The channel has been set in the PIB.
 */
uint8_t ieee802154_pib_get_channel(void);

/**
 * @brief  Set a specific transmission power to the PIB.
 *
 * @param[in]  power  The power.
 *
 */
void ieee802154_pib_set_power(int8_t power);

/**
 * @brief  Get the transmission power from the PIB.
 *
 * @return
 *        - The transmission power has been set in the PIB.
 */
int8_t ieee802154_pib_get_power(void);

/**
 * @brief  Set the promiscuous mode to the PIB.
 *
 * @param[in]  enable  True for enabling the promiscuous mode, otherwise false.
 *
 */
void ieee802154_pib_set_promiscuous(bool enable);

/**
 * @brief  Get the promiscuous mode from the PIB.
 *
 * @return
 *        - The promiscuous mode has been set in the PIB.
 */
bool ieee802154_pib_get_promiscuous(void);

/**
 * @brief  Set a specific CCA threshold to the PIB.
 *
 * @param[in]  cca_threshold  The CCA threshold.
 *
 */
void ieee802154_pib_set_cca_threshold(int8_t cca_threshold);

/**
 * @brief  Get the CCA threshold from the PIB.
 *
 * @return
 *        - The CCA threshold has been set in the PIB.
 */
 int8_t ieee802154_pib_get_cca_threshold(void);

/**
 * @brief  Set the CCA mode to the PIB.
 *
 * @param[in]  cca_mode  The CCA mode.
 *
 */
void ieee802154_pib_set_cca_mode(ieee802154_ll_cca_mode_t cca_mode);

/**
 * @brief  Get the CCA mode from the PIB.
 *
 * @return
 *        - The CCA mode has been set in the PIB.
 */
ieee802154_ll_cca_mode_t ieee802154_pib_get_cca_mode(void);

/**
 * @brief  Configure the auto-ack transmission mode to the PIB.
 *
 * @param[in]  enable  True for enabling the auto-ack transmission mode, otherwise false.
 *
 */
void ieee802154_pib_set_auto_ack_tx(bool enable);

/**
 * @brief  Get the auto-ack transmission mode from the PIB.
 *
 * @return
 *        - The auto-ack transmission mode has been set in the PIB.
 */
bool ieee802154_pib_get_auto_ack_tx(void);

/**
 * @brief  Configure the auto-ack receiving mode to the PIB.
 *
 * @param[in]  enable  True for enabling the auto-ack receiving mode, otherwise false.
 *
 */
void ieee802154_pib_set_auto_ack_rx(bool enable);

/**
 * @brief  Get the auto-ack receiving mode from the PIB.
 *
 * @return
 *        - The auto-ack receiving mode has been set in the PIB.
 */
bool ieee802154_pib_get_auto_ack_rx(void);

/**
 * @brief  Configure the enh-ack timing mode to the PIB.
 *
 * @param[in]  enable  True for enabling the enh-ack timing mode, otherwise false.
 *
 */
void ieee802154_pib_set_enhance_ack_tx(bool enable);

/**
 * @brief  Get the enh-ack timing mode from the PIB.
 *
 * @return
 *        - The enh-ack timing mode has been set in the PIB.
 */
bool ieee802154_pib_get_enhance_ack_tx(void);

/**
 * @brief  Configure this bit to the PIB to indicate the device is coordinator.
 *
 * @param[in]  enable  True for configuring the device coordinator, otherwise false.
 *
 */
void ieee802154_pib_set_coordinator(bool enable);

/**
 * @brief  Get the coordinator configuration of device from the PIB.
 *
 * @return
 *        - The coordinator configuration of device has been set in the PIB.
 */
bool ieee802154_pib_get_coordinator(void);

/**
 * @brief  Configure the pending mode to the PIB.
 *
 * @param[in]  pending_mode  The pending mode.
 *
 */
void ieee802154_pib_set_pending_mode(ieee802154_ll_pending_mode_t pending_mode);

/**
 * @brief  Get the pending mode from the PIB.
 *
 * @return
 *        - The pending mode has been set in the PIB.
 */
ieee802154_ll_pending_mode_t ieee802154_pib_get_pending_mode(void);

/**
 * @brief  Configure the radio mode when the radio is going to enter idle to the PIB.
 *
 * @param[in]  enable  True for continuing to receive when the radio is going to enter ilde, otherwise false.
 *
 */
void ieee802154_pib_set_rx_when_idle(bool enable);

/**
 * @brief  Get the radio mode when the radio is going to enter ilde to the PIB.
 *
 * @return
 *        - True for continuing to receive when the radio is going to enter ilde, otherwise false.
 *
 */
bool ieee802154_pib_get_rx_when_idle(void);

#ifdef __cplusplus
}
#endif