/*
 * 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 <bluetooth/gatt.h>
#include <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_ */
