/** @file
 *  @brief Internal APIs for Bluetooth Hearing Access Profile.
 */

/*
 * Copyright (c) 2022 Codecoup
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/* Control Point opcodes */
#define BT_HAS_OP_READ_PRESET_REQ        0x01
#define BT_HAS_OP_READ_PRESET_RSP        0x02
#define BT_HAS_OP_PRESET_CHANGED         0x03
#define BT_HAS_OP_WRITE_PRESET_NAME      0x04
#define BT_HAS_OP_SET_ACTIVE_PRESET      0x05
#define BT_HAS_OP_SET_NEXT_PRESET        0x06
#define BT_HAS_OP_SET_PREV_PRESET        0x07
#define BT_HAS_OP_SET_ACTIVE_PRESET_SYNC 0x08
#define BT_HAS_OP_SET_NEXT_PRESET_SYNC   0x09
#define BT_HAS_OP_SET_PREV_PRESET_SYNC   0x0a

/* Application error codes */
#define BT_HAS_ERR_INVALID_OPCODE         0x80
#define BT_HAS_ERR_WRITE_NAME_NOT_ALLOWED 0x81
#define BT_HAS_ERR_PRESET_SYNC_NOT_SUPP   0x82
#define BT_HAS_ERR_OPERATION_NOT_POSSIBLE 0x83
#define BT_HAS_ERR_INVALID_PARAM_LEN      0x84

/* Hearing Aid Feature bits */
#define BT_HAS_FEAT_HEARING_AID_TYPE_LSB  BIT(0)
#define BT_HAS_FEAT_HEARING_AID_TYPE_MSB  BIT(1)
#define BT_HAS_FEAT_PRESET_SYNC_SUPP      BIT(2)
#define BT_HAS_FEAT_INDEPENDENT_PRESETS   BIT(3)
#define BT_HAS_FEAT_DYNAMIC_PRESETS       BIT(4)
#define BT_HAS_FEAT_WRITABLE_PRESETS_SUPP BIT(5)

#define BT_HAS_FEAT_HEARING_AID_TYPE_MASK (BT_HAS_FEAT_HEARING_AID_TYPE_LSB | \
					   BT_HAS_FEAT_HEARING_AID_TYPE_MSB)

/* Preset Changed Change ID values */
#define BT_HAS_CHANGE_ID_GENERIC_UPDATE     0x00
#define BT_HAS_CHANGE_ID_PRESET_DELETED     0x01
#define BT_HAS_CHANGE_ID_PRESET_AVAILABLE   0x02
#define BT_HAS_CHANGE_ID_PRESET_UNAVAILABLE 0x03

#define BT_HAS_IS_LAST 0x01

struct bt_has {
	/** Hearing Aid Features value */
	uint8_t features;

	/** Active preset index value */
	uint8_t active_index;

	/* Whether the service has been registered or not */
	bool registered;
};

struct bt_has_cp_hdr {
	uint8_t opcode;
	uint8_t data[0];
} __packed;

struct bt_has_cp_read_presets_req {
	uint8_t start_index;
	uint8_t num_presets;
} __packed;

struct bt_has_cp_read_preset_rsp {
	uint8_t is_last;
	uint8_t index;
	uint8_t properties;
	uint8_t name[0];
} __packed;

struct bt_has_cp_preset_changed {
	uint8_t change_id;
	uint8_t is_last;
	uint8_t additional_params[0];
} __packed;

struct bt_has_cp_generic_update {
	uint8_t prev_index;
	uint8_t index;
	uint8_t properties;
	uint8_t name[0];
} __packed;

struct bt_has_cp_write_preset_name {
	uint8_t index;
	uint8_t name[0];
} __packed;

struct bt_has_cp_set_active_preset {
	uint8_t index;
} __packed;

static inline const char *bt_has_op_str(uint8_t op)
{
	switch (op) {
	case BT_HAS_OP_READ_PRESET_REQ:
		return "Read preset request";
	case BT_HAS_OP_READ_PRESET_RSP:
		return "Read preset response";
	case BT_HAS_OP_PRESET_CHANGED:
		return "Preset changed";
	case BT_HAS_OP_WRITE_PRESET_NAME:
		return "Write preset name";
	case BT_HAS_OP_SET_ACTIVE_PRESET:
		return "Set active preset";
	case BT_HAS_OP_SET_NEXT_PRESET:
		return "Set next preset";
	case BT_HAS_OP_SET_PREV_PRESET:
		return "Set previous preset";
	case BT_HAS_OP_SET_ACTIVE_PRESET_SYNC:
		return "Set active preset (sync)";
	case BT_HAS_OP_SET_NEXT_PRESET_SYNC:
		return "Set next preset (sync)";
	case BT_HAS_OP_SET_PREV_PRESET_SYNC:
		return "Set previous preset (sync)";
	default:
		return "Unknown";
	}
}

static inline const char *bt_has_change_id_str(uint8_t change_id)
{
	switch (change_id) {
	case BT_HAS_CHANGE_ID_GENERIC_UPDATE:
		return "Generic update";
	case BT_HAS_CHANGE_ID_PRESET_DELETED:
		return "Preset deleted";
	case BT_HAS_CHANGE_ID_PRESET_AVAILABLE:
		return "Preset available";
	case BT_HAS_CHANGE_ID_PRESET_UNAVAILABLE:
		return "Preset unavailable";
	default:
		return "Unknown changeId";
	}
}
