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

#ifndef BT_GATT_OTS_INTERNAL_H_
#define BT_GATT_OTS_INTERNAL_H_

#ifdef __cplusplus
extern "C" {
#endif

#include <zephyr/types.h>
#include "ots_l2cap_internal.h"
#include "ots_oacp_internal.h"
#include "ots_olcp_internal.h"

#define BT_OTS_SET_METADATA_REQ_NAME(metadata) \
	((metadata) = (metadata) | BT_OTS_METADATA_REQ_NAME)
#define BT_OTS_SET_METADATA_REQ_TYPE(metadata) \
	((metadata) = (metadata) | BT_OTS_METADATA_REQ_TYPE)
#define BT_OTS_SET_METADATA_REQ_SIZE(metadata) \
	((metadata) = (metadata) | BT_OTS_METADATA_REQ_SIZE)
#define BT_OTS_SET_METADATA_REQ_CREATED(metadata) \
	((metadata) = (metadata) | BT_OTS_METADATA_REQ_CREATED)
#define BT_OTS_SET_METADATA_REQ_MODIFIED(metadata) \
	((metadata) = (metadata) | BT_OTS_METADATA_REQ_MODIFIED)
#define BT_OTS_SET_METADATA_REQ_ID(metadata) \
	((metadata) = (metadata) | BT_OTS_METADATA_REQ_ID)
#define BT_OTS_SET_METADATA_REQ_PROPS(metadata) \
	((metadata) = (metadata) | BT_OTS_METADATA_REQ_PROPS)

#define BT_OTS_GET_METADATA_REQ_NAME(metadata) \
	((metadata) & BT_OTS_METADATA_REQ_NAME)
#define BT_OTS_GET_METADATA_REQ_TYPE(metadata) \
	((metadata) & BT_OTS_METADATA_REQ_TYPE)
#define BT_OTS_GET_METADATA_REQ_SIZE(metadata) \
	((metadata) & BT_OTS_METADATA_REQ_SIZE)
#define BT_OTS_GET_METADATA_REQ_CREATED(metadata) \
	((metadata) & BT_OTS_METADATA_REQ_CREATED)
#define BT_OTS_GET_METADATA_REQ_MODIFIED(metadata) \
	((metadata) & BT_OTS_METADATA_REQ_MODIFIED)
#define BT_OTS_GET_METADATA_REQ_ID(metadata) \
	((metadata) & BT_OTS_METADATA_REQ_ID)
#define BT_OTS_GET_METADATA_REQ_PROPS(metadata) \
	((metadata) & BT_OTS_METADATA_REQ_PROPS)

/**@brief OTS Attribute Protocol Application Error codes. */
enum bt_gatt_ots_att_err_codes {
	/** An attempt was made to write a value that is invalid or
	 *  not supported by this Server for a reason other than
	 *  the attribute permissions.
	 */
	BT_GATT_OTS_WRITE_REQUEST_REJECTED     = 0x80,
	/** An attempt was made to read or write to an Object Metadata
	 *  characteristic while the Current Object was an Invalid Object.
	 */
	BT_GATT_OTS_OBJECT_NOT_SELECTED        = 0x81,
	/** The Server is unable to service the Read Request or Write Request
	 *  because it exceeds the concurrency limit of the service.
	 */
	BT_GATT_OTS_CONCURRENCY_LIMIT_EXCEEDED = 0x82,
	/** The requested object name was rejected because
	 *  the name was already in use by an existing object on the Server.
	 */
	BT_GATT_OTS_OBJECT_NAME_ALREADY_EXISTS = 0x83,
};

enum bt_gatt_ots_object_state_type {
	BT_GATT_OTS_OBJECT_IDLE_STATE,

	BT_GATT_OTS_OBJECT_READ_OP_STATE,

	BT_GATT_OTS_OBJECT_WRITE_OP_STATE,
};

struct bt_gatt_ots_object_state {
	enum bt_gatt_ots_object_state_type type;
	union {
		struct bt_gatt_ots_object_read_op {
			struct bt_gatt_ots_oacp_read_params oacp_params;
			uint32_t sent_len;
		} read_op;
		struct bt_gatt_ots_object_write_op {
			struct bt_gatt_ots_oacp_write_params oacp_params;
			uint32_t recv_len;
		} write_op;
	};
};

struct bt_gatt_ots_object {
	uint64_t id;
	struct bt_ots_obj_metadata metadata;
	struct bt_gatt_ots_object_state state;
};

struct bt_gatt_ots_indicate {
	struct bt_gatt_indicate_params params;
	struct bt_gatt_attr attr;
	struct _bt_gatt_ccc ccc;
	bool is_enabled;
};

struct bt_ots {
	struct bt_ots_feat features;
	struct bt_gatt_ots_object *cur_obj;
	struct bt_gatt_service *service;
	struct bt_gatt_ots_indicate oacp_ind;
	struct bt_gatt_ots_indicate olcp_ind;
	struct bt_gatt_ots_l2cap l2cap;
	struct bt_ots_cb *cb;
	struct bt_ots_dir_list *dir_list;
	void *obj_manager;
};

int bt_ots_obj_add_internal(struct bt_ots *ots, struct bt_conn *conn,
			    const struct bt_ots_obj_add_param *param,
			    struct bt_gatt_ots_object **obj);
#ifdef __cplusplus
}
#endif

#endif /* BT_GATT_OTS_INTERNAL_H_ */
