/******************************************************************************
 *
 *  Copyright 2004-2012 Broadcom Corporation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at:
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 ******************************************************************************/

/******************************************************************************
 *
 *  This is the public interface file for the Personal Area Networking (PAN)
 *  subsystem of BTA, Broadcom's Bluetooth application layer for mobile
 *  phones.
 *
 ******************************************************************************/
#ifndef BTA_PAN_API_H
#define BTA_PAN_API_H

#include <cstdint>

#include "types/raw_address.h"

/*****************************************************************************
 *  Constants and data types
 ****************************************************************************/
constexpr bool BTA_PAN_SUCCESS = true;
constexpr bool BTA_PAN_FAIL = false;
typedef bool tBTA_PAN_STATUS;

/* PAN Callback events */
typedef enum : uint8_t {
  BTA_PAN_ENABLE_EVT = 0,   /* PAN service is enabled. */
  BTA_PAN_SET_ROLE_EVT = 1, /* PAN roles registered */
  BTA_PAN_OPENING_EVT = 2,  /* Connection is being opened. */
  BTA_PAN_OPEN_EVT = 3,     /* Connection has been opened. */
  BTA_PAN_CLOSE_EVT = 4,    /* Connection has been closed. */
} tBTA_PAN_EVT;

/* pan roles */
#define BTA_PAN_ROLE_PANU PAN_ROLE_CLIENT
#define BTA_PAN_ROLE_NAP PAN_ROLE_NAP_SERVER

typedef uint8_t tBTA_PAN_ROLE;

/*  information regarding PAN roles */
typedef struct {
  const char* p_srv_name; /* service name for the PAN role */
  uint8_t app_id;         /* application id */
} tBTA_PAN_ROLE_INFO;

/* Event associated with BTA_PAN_SET_ROLE_EVT */
typedef struct {
  tBTA_PAN_STATUS status; /* status of set role event */
  tBTA_PAN_ROLE role;     /* PAN roles successfully registered */
} tBTA_PAN_SET_ROLE;

/* Event associated with BTA_PAN_OPENING_EVT */
typedef struct {
  RawAddress bd_addr; /* BD address of peer device. */
  uint16_t handle; /* Handle associated with this connection. */

} tBTA_PAN_OPENING;

/* Event associated with BTA_PAN_OPEN_EVT */
typedef struct {
  RawAddress bd_addr;       /* BD address of peer device. */
  uint16_t handle;          /* Handle associated with this connection. */
  tBTA_PAN_STATUS status;   /* status of open event */
  tBTA_PAN_ROLE local_role; /* Local device PAN role for the connection */
  tBTA_PAN_ROLE peer_role;  /* Peer device PAN role for the connection */

} tBTA_PAN_OPEN;

/* Event associated with BTA_PAN_CLOSE_EVT */
typedef struct {
  uint16_t handle; /* Handle associated with the connection. */
} tBTA_PAN_CLOSE;

/* Union of all PAN callback structures */
typedef union {
  tBTA_PAN_SET_ROLE set_role; /* set_role event */
  tBTA_PAN_OPEN open;         /* Connection has been opened. */
  tBTA_PAN_OPENING opening;   /* Connection being opened */
  tBTA_PAN_CLOSE close;       /* Connection has been closed. */
} tBTA_PAN;

/* Number of PAN connections */
#ifndef BTA_PAN_NUM_CONN
#define BTA_PAN_NUM_CONN 4
#endif

/* PAN callback */
typedef void(tBTA_PAN_CBACK)(tBTA_PAN_EVT event, tBTA_PAN* p_data);

/*****************************************************************************
 *  External Function Declarations
 ****************************************************************************/

/*******************************************************************************
 *
 * Function         BTA_PanEnable
 *
 * Description      Enable PAN service.  This function must be
 *                  called before any other functions in the PAN API are called.
 *                  When the enable operation is complete the callback function
 *                  will be called with a BTA_PAN_ENABLE_EVT.
 *
 * Returns          void
 *
 ******************************************************************************/
extern void BTA_PanEnable(tBTA_PAN_CBACK p_cback);

/*******************************************************************************
 *
 * Function         BTA_PanDisable
 *
 * Description      Disable PAN service.
 *
 * Returns          void
 *
 ******************************************************************************/
extern void BTA_PanDisable(void);

/*******************************************************************************
 *
 * Function         BTA_PanSetRole
 *
 * Description      Sets PAN roles. When the enable operation is complete
 *                  the callback function will be called with a
 *                  BTA_PAN_SET_ROLE_EVT.
 *
 * Returns          void
 *
 ******************************************************************************/
void BTA_PanSetRole(tBTA_PAN_ROLE role, tBTA_PAN_ROLE_INFO* p_user_info,
                    tBTA_PAN_ROLE_INFO* p_nap_info);

/*******************************************************************************
 *
 * Function         BTA_PanOpen
 *
 * Description      Opens a connection to a peer device.
 *                  When connection is open callback function is called
 *                  with a BTA_PAN_OPEN_EVT.
 *
 *
 * Returns          void
 *
 ******************************************************************************/
void BTA_PanOpen(const RawAddress& bd_addr, tBTA_PAN_ROLE local_role,
                 tBTA_PAN_ROLE peer_role);

/*******************************************************************************
 *
 * Function         BTA_PanClose
 *
 * Description      Close a PAN  connection to a peer device.
 *
 *
 * Returns          void
 *
 ******************************************************************************/
extern void BTA_PanClose(uint16_t handle);

#endif /* BTA_PAN_API_H */
