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

#ifndef BT_GATT_OTS_OACP_H_
#define BT_GATT_OTS_OACP_H_

#ifdef __cplusplus
extern "C" {
#endif

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

/* Types of Object Action Control Point Procedures. */
enum bt_gatt_ots_oacp_proc_type {
	/** Create object.*/
	BT_GATT_OTS_OACP_PROC_CREATE        = 0x01,
	/** Delete object.*/
	BT_GATT_OTS_OACP_PROC_DELETE        = 0x02,
	/** Calculate Checksum.*/
	BT_GATT_OTS_OACP_PROC_CHECKSUM_CALC = 0x03,
	/** Execute Object.*/
	BT_GATT_OTS_OACP_PROC_EXECUTE       = 0x04,
	/** Read object.*/
	BT_GATT_OTS_OACP_PROC_READ          = 0x05,
	/** Write object.*/
	BT_GATT_OTS_OACP_PROC_WRITE         = 0x06,
	/** Abort object.*/
	BT_GATT_OTS_OACP_PROC_ABORT         = 0x07,
	/** Procedure response.*/
	BT_GATT_OTS_OACP_PROC_RESP          = 0x60
};

/* Object Action Control Point return codes. */
enum bt_gatt_ots_oacp_res_code {
	/** Success.*/
	BT_GATT_OTS_OACP_RES_SUCCESS        = 0x01,
	/** Not supported*/
	BT_GATT_OTS_OACP_RES_OPCODE_NOT_SUP = 0x02,
	/** Invalid parameter*/
	BT_GATT_OTS_OACP_RES_INV_PARAM      = 0x03,
	/** Insufficient resources.*/
	BT_GATT_OTS_OACP_RES_INSUFF_RES     = 0x04,
	/** Invalid object.*/
	BT_GATT_OTS_OACP_RES_INV_OBJ        = 0x05,
	/** Channel unavailable.*/
	BT_GATT_OTS_OACP_RES_CHAN_UNAVAIL   = 0x06,
	/** Unsupported procedure.*/
	BT_GATT_OTS_OACP_RES_UNSUP_TYPE     = 0x07,
	/** Procedure not permitted.*/
	BT_GATT_OTS_OACP_RES_NOT_PERMITTED  = 0x08,
	/** Object locked.*/
	BT_GATT_OTS_OACP_RES_OBJ_LOCKED     = 0x09,
	/** Operation Failed.*/
	BT_GATT_OTS_OACP_RES_OPER_FAILED    = 0x0A
};

#define BT_GATT_OTS_OACP_PROC_WRITE_MODE_TRUNC 1

#define BT_GATT_OTS_OACP_PROC_WRITE_MODE_GET_TRUNC(mode) \
	((mode) & BIT(BT_GATT_OTS_OACP_PROC_WRITE_MODE_TRUNC))

#define BT_GATT_OTS_OACP_PROC_WRITE_MODE_GET_RFU(mode) \
	((mode) & ~BIT(BT_GATT_OTS_OACP_PROC_WRITE_MODE_TRUNC))

/* Object Action Control Point procedure definition. */
struct bt_gatt_ots_oacp_proc {
	enum bt_gatt_ots_oacp_proc_type type;
	union {
		struct bt_gatt_ots_oacp_create_params {
			uint32_t size;
			struct bt_ots_obj_type type;
		} create_params;
		struct bt_gatt_ots_oacp_cs_calc_params {
			uint32_t offset;
			uint32_t len;
		} cs_calc_params;
		struct bt_gatt_ots_oacp_read_params {
			uint32_t offset;
			uint32_t len;
		} read_params;
		struct bt_gatt_ots_oacp_write_params {
			uint32_t offset;
			uint32_t len;
			uint8_t mode;
		} write_params;
	};
};

/* Size of the generic part of the Object Action Control Point create procedure */
#define BT_GATT_OTS_OACP_CREATE_GENERIC_PARAMS_SIZE 4

/* Size of Object Action Control Point checksum calculation procedure */
#define BT_GATT_OTS_OACP_CS_CALC_PARAMS_SIZE 8

/* Size of Object Action Control Point read procedure */
#define BT_GATT_OTS_OACP_READ_PARAMS_SIZE 8

/* Size of Object Action Control Point write procedure */
#define BT_GATT_OTS_OACP_WRITE_PARAMS_SIZE 9

ssize_t bt_gatt_ots_oacp_write(struct bt_conn *conn,
				   const struct bt_gatt_attr *attr,
				   const void *buf, uint16_t len,
				   uint16_t offset, uint8_t flags);

void bt_gatt_ots_oacp_cfg_changed(const struct bt_gatt_attr *attr,
				      uint16_t value);

#ifdef __cplusplus
}
#endif

#endif /* BT_GATT_OTS_OACP_H_ */
