/*
 * Copyright (c) 2020 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#define PROTOCOL_TIMEOUT     K_SECONDS(60)

/** @def PROV_BEARER_BUF_HEADROOM
 *
 *  @brief Required headroom for the bearer packet buffers.
 */
#if defined(CONFIG_BT_MESH_PB_GATT_COMMON)
#define PROV_BEARER_BUF_HEADROOM 5
#else
#define PROV_BEARER_BUF_HEADROOM 0
#endif

enum prov_bearer_link_status {
	PROV_BEARER_LINK_STATUS_SUCCESS,
	PROV_BEARER_LINK_STATUS_TIMEOUT,
	PROV_BEARER_LINK_STATUS_FAIL,
};

struct prov_bearer;

/** Callbacks from bearer to host */
struct prov_bearer_cb {

	void (*link_opened)(const struct prov_bearer *bearer, void *cb_data);

	void (*link_closed)(const struct prov_bearer *bearer, void *cb_data,
			    enum prov_bearer_link_status reason);

	void (*error)(const struct prov_bearer *bearer, void *cb_data,
		      uint8_t err);

	void (*recv)(const struct prov_bearer *bearer, void *cb_data,
		     struct net_buf_simple *buf);
};

typedef void (*prov_bearer_send_complete_t)(int err, void *cb_data);

/** Provisioning bearer API */
struct prov_bearer {
	/** Provisioning bearer type. */
	bt_mesh_prov_bearer_t type;

	/** @brief Enable link establishment as a provisionee.
	 *
	 *  Prompts the bearer to make itself visible to provisioners, and
	 *  start accepting link open messages.
	 *
	 *  @param cb Bearer event callbacks used for the duration of the link.
	 *  @param cb_data Context parameter to pass to the bearer callbacks.
	 *
	 *  @return Zero on success, or (negative) error code otherwise.
	 */
	int (*link_accept)(const struct prov_bearer_cb *cb, void *cb_data);

	/** @brief Send a packet on an established link.
	 *
	 *  @param buf     Payload buffer. Requires @ref
	 *                 PROV_BEARER_BUF_HEADROOM bytes of headroom.
	 *  @param cb      Callback to call when sending is complete.
	 *  @param cb_data Callback data.
	 *
	 *  @return Zero on success, or (negative) error code otherwise.
	 */
	int (*send)(struct net_buf_simple *buf, prov_bearer_send_complete_t cb,
		    void *cb_data);

	/** @brief Clear any ongoing transmissions, if possible.
	 *
	 *  Bearers that don't support tx clearing must implement this callback
	 *  and leave it empty.
	 */
	void (*clear_tx)(void);

	/* Only available in provisioners: */

	/** @brief Open a new link as a provisioner.
	 *
	 *  Only available in provisioners. Bearers that don't support the
	 *  provisioner role should leave this as NULL.
	 *
	 *  @param uuid UUID of the node to establish a link to.
	 *  @param timeout Protocol timeout.
	 *  @param cb Bearer event callbacks used for the duration of the link.
	 *  @param cb_data Context parameter to pass to the bearer callbacks.
	 *
	 *  @return Zero on success, or (negative) error code otherwise.
	 */
	int (*link_open)(const uint8_t uuid[16], k_timeout_t timeout,
			 const struct prov_bearer_cb *cb, void *cb_data);

	/** @brief Close the current link.
	 *
	 *  Only available in provisioners. Bearers that don't support the
	 *  provisioner role should leave this as NULL.
	 *
	 *  @param status Link status for the link close message.
	 */
	void (*link_close)(enum prov_bearer_link_status status);
};

extern const struct prov_bearer pb_adv;
extern const struct prov_bearer pb_gatt;

void pb_adv_init(void);
void pb_gatt_init(void);

void pb_adv_reset(void);
void pb_gatt_reset(void);
