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

#ifndef BT_OTS_DIR_LIST_INTERNAL_H_
#define BT_OTS_DIR_LIST_INTERNAL_H_

#ifdef __cplusplus
extern "C" {
#endif

#include <sys/types.h>
#include <zephyr/types.h>
#include <zephyr/bluetooth/gatt.h>
#include <zephyr/bluetooth/services/ots.h>

/** Maximum size of the Directory Listing Object Record. Table 4.1 in the OTS spec. */
#define DIR_LIST_OBJ_RECORD_MIN_SIZE       13
#define DIR_LIST_OBJ_RECORD_MAX_SIZE       172
#define DIR_LIST_MAX_SIZE (DIR_LIST_OBJ_RECORD_MAX_SIZE * CONFIG_BT_OTS_MAX_OBJ_CNT)

/** @brief Directory Listing Buffer Size
 *
 * In order to transmit the maximum size we choose CONFIG_BT_OTS_L2CAP_CHAN_TX_MTU
 * as the buffer size. However, dir_list_object_encode function encodes one full
 * object record at a time so the buffer must be a multiple of object record length.
 */
#define OTS_DIR_LIST_BUFFER_SIZE (DIR_LIST_OBJ_RECORD_MAX_SIZE * \
	ceiling_fraction(CONFIG_BT_OTS_L2CAP_CHAN_TX_MTU, DIR_LIST_OBJ_RECORD_MAX_SIZE))

struct bt_ots_dir_list {
	struct net_buf_simple net_buf;
	struct bt_gatt_ots_object *dir_list_obj;
	off_t anchor_offset;
	struct bt_gatt_ots_object *anchor_object;
	uint8_t _content[OTS_DIR_LIST_BUFFER_SIZE];
};

/** @brief Directory Listing record flag field. */
enum {
	/** Bit 0 Object Type UUID Size 0: 16bit 1: 128bit*/
	BT_OTS_DIR_LIST_FLAG_TYPE_128            = 0,
	/** Bit 1 Current Size Present*/
	BT_OTS_DIR_LIST_FLAG_CUR_SIZE            = 1,
	/** Bit 2 Allocated Size Present */
	BT_OTS_DIR_LIST_FLAG_ALLOC_SIZE          = 2,
	/** Bit 3 Object First-Created Present*/
	BT_OTS_DIR_LIST_FLAG_FIRST_CREATED       = 3,
	/** Bit 4 Object Last-Modified Present*/
	BT_OTS_DIR_LIST_FLAG_LAST_MODIFIED       = 4,
	/** Bit 5 Object Properties Present*/
	BT_OTS_DIR_LIST_FLAG_PROPERTIES          = 5,
	/** Bit 6 RFU*/
	BT_OTS_DIR_LIST_FLAG_RFU                 = 6,
	/** Bit 7 Extended Flags Present*/
	BT_OTS_DIR_LIST_FLAG_EXTENDED            = 7,
};

/** @brief Set @ref BT_OTS_DIR_LIST_SET_FLAG_TYPE_128 flag.
 *
 *  @param flags Directory Listing Object flags.
 */
#define BT_OTS_DIR_LIST_SET_FLAG_TYPE_128(flags) \
	WRITE_BIT((flags), BT_OTS_DIR_LIST_FLAG_TYPE_128, 1)

/** @brief Set @ref BT_OTS_DIR_LIST_FLAG_CUR_SIZE flag.
 *
 *  @param flags Directory Listing Object flags.
 */
#define BT_OTS_DIR_LIST_SET_FLAG_CUR_SIZE(flags) \
	WRITE_BIT((flags), BT_OTS_DIR_LIST_FLAG_CUR_SIZE, 1)

/** @brief Set @ref BT_OTS_DIR_LIST_FLAG_ALLOC_SIZE flag.
 *
 *  @param flags Directory Listing Object flags.
 */
#define BT_OTS_DIR_LIST_SET_FLAG_ALLOC_SIZE(flags) \
	WRITE_BIT((flags), BT_OTS_DIR_LIST_FLAG_ALLOC_SIZE, 1)

/** @brief Set @ref BT_OTS_DIR_LIST_FLAG_FIRST_CREATED flag.
 *
 *  @param flags Directory Listing Object flags.
 */
#define BT_OTS_DIR_LIST_SET_FLAG_FIRST_CREATED(flags) \
	WRITE_BIT((flags), BT_OTS_DIR_LIST_FLAG_FIRST_CREATED, 1)

/** @brief Set @ref BT_OTS_DIR_LIST_FLAG_LAST_MODIFIED flag.
 *
 *  @param flags Directory Listing Object flags.
 */
#define BT_OTS_DIR_LIST_SET_FLAG_LAST_MODIFIED(flags) \
	WRITE_BIT((flags), BT_OTS_DIR_LIST_FLAG_LAST_MODIFIED, 1)

/** @brief Set @ref BT_OTS_DIR_LIST_FLAG_PROPERTIES flag.
 *
 *  @param flags Directory Listing Object flags.
 */
#define BT_OTS_DIR_LIST_SET_FLAG_PROPERTIES(flags) \
	WRITE_BIT((flags), BT_OTS_DIR_LIST_FLAG_PROPERTIES, 1)

/** @brief Set @ref BT_OTS_DIR_LIST_FLAG_EXTENDED flag.
 *
 *  @param flags Directory Listing Object flags.
 */
#define BT_OTS_DIR_LIST_SET_FLAG_EXTENDED(flags) \
	WRITE_BIT((flags), BT_OTS_DIR_LIST_FLAG_EXTENDED, 1)

/** @brief Get @ref BT_OTS_DIR_LIST_GET_FLAG_TYPE_128 flag.
 *
 *  @param flags Directory Listing Object flags.
 */
#define BT_OTS_DIR_LIST_GET_FLAG_TYPE_128(flags) \
	((flags) & BIT(BT_OTS_DIR_LIST_FLAG_TYPE_128))

/** @brief Get @ref BT_OTS_DIR_LIST_GET_FLAG_CUR_SIZE flag.
 *
 *  @param flags Directory Listing Object flags.
 */
#define BT_OTS_DIR_LIST_GET_FLAG_CUR_SIZE(flags) \
	((flags) & BIT(BT_OTS_DIR_LIST_FLAG_CUR_SIZE))

/** @brief Get @ref BT_OTS_DIR_LIST_GET_FLAG_ALLOC_SIZE flag.
 *
 *  @param flags Directory Listing Object flags.
 */
#define BT_OTS_DIR_LIST_GET_FLAG_ALLOC_SIZE(flags) \
	((flags) & BIT(BT_OTS_DIR_LIST_FLAG_ALLOC_SIZE))

/** @brief Get @ref BT_OTS_DIR_LIST_GET_FLAG_FIRST_CREATED flag.
 *
 *  @param flags Directory Listing Object flags.
 */
#define BT_OTS_DIR_LIST_GET_FLAG_FIRST_CREATED(flags) \
	((flags) & BIT(BT_OTS_DIR_LIST_FLAG_FIRST_CREATED))

/** @brief Get @ref BT_OTS_DIR_LIST_GET_FLAG_LAST_MODIFIED flag.
 *
 *  @param flags Directory Listing Object flags.
 */
#define BT_OTS_DIR_LIST_GET_FLAG_LAST_MODIFIED(flags) \
	((flags) & BIT(BT_OTS_DIR_LIST_FLAG_LAST_MODIFIED))

/** @brief Get @ref BT_OTS_DIR_LIST_GET_FLAG_PROPERTIES flag.
 *
 *  @param flags Directory Listing Object flags.
 */
#define BT_OTS_DIR_LIST_GET_FLAG_PROPERTIES(flags) \
	((flags) & BIT(BT_OTS_DIR_LIST_FLAG_PROPERTIES))

/** @brief Get @ref BT_OTS_DIR_LIST_GET_FLAG_EXTENDED flag.
 *
 *  @param flags Directory Listing Object flags.
 */
#define BT_OTS_DIR_LIST_GET_FLAG_EXTENDED(flags) \
	((flags) & BIT(BT_OTS_DIR_LIST_FLAG_EXTENDED))

void bt_ots_dir_list_selected(struct bt_ots_dir_list *dir_list, void *obj_manager,
			      struct bt_gatt_ots_object *cur_obj);
void bt_ots_dir_list_init(struct bt_ots_dir_list **dir_list, void *obj_manager);
ssize_t bt_ots_dir_list_content_get(struct bt_ots_dir_list *dir_list, void *obj_manager,
				    void **data, size_t len, off_t offset);
bool bt_ots_dir_list_is_idle(const struct bt_ots_dir_list *dir_list);

#ifdef __cplusplus
}
#endif

#endif /* BT_OTS_DIR_LIST_INTERNAL_H_ */
