/*
 * 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)
#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);
