/** @file
 *  @brief Internal APIs for Bluetooth AICS.
 */

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

#ifndef ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_AICS_INTERNAL_
#define ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_AICS_INTERNAL_
#include <zephyr/types.h>
#include <zephyr/bluetooth/gatt.h>

#if defined(CONFIG_BT_AICS)
#define BT_AICS_MAX_DESC_SIZE CONFIG_BT_AICS_MAX_INPUT_DESCRIPTION_SIZE
#else
#define BT_AICS_MAX_DESC_SIZE 1
#endif /* CONFIG_BT_AICS */

/* AICS opcodes */
#define BT_AICS_OPCODE_SET_GAIN                    0x01
#define BT_AICS_OPCODE_UNMUTE                      0x02
#define BT_AICS_OPCODE_MUTE                        0x03
#define BT_AICS_OPCODE_SET_MANUAL                  0x04
#define BT_AICS_OPCODE_SET_AUTO                    0x05

/* AICS status */
#define BT_AICS_STATUS_INACTIVE                    0x00
#define BT_AICS_STATUS_ACTIVE                      0x01

#define BT_AICS_INPUT_MODE_IMMUTABLE(gain_mode) \
	((gain_mode) == BT_AICS_MODE_MANUAL_ONLY || (gain_mode) == BT_AICS_MODE_AUTO_ONLY)

#define BT_AICS_INPUT_MODE_SETTABLE(gain_mode) \
	((gain_mode) == BT_AICS_MODE_AUTO || (gain_mode) == BT_AICS_MODE_MANUAL)

struct bt_aics_control {
	uint8_t opcode;
	uint8_t counter;
} __packed;

struct bt_aics_gain_control {
	struct bt_aics_control cp;
	int8_t gain_setting;
} __packed;

struct bt_aics_client {
	uint8_t change_counter;
	uint8_t gain_mode;
	bool desc_writable;
	bool active;

	uint16_t start_handle;
	uint16_t end_handle;
	uint16_t state_handle;
	uint16_t gain_handle;
	uint16_t type_handle;
	uint16_t status_handle;
	uint16_t control_handle;
	uint16_t desc_handle;
	struct bt_gatt_subscribe_params state_sub_params;
	struct bt_gatt_subscribe_params status_sub_params;
	struct bt_gatt_subscribe_params desc_sub_params;
	bool cp_retried;

	bool busy;
	struct bt_aics_gain_control cp_val;
	struct bt_gatt_write_params write_params;
	struct bt_gatt_read_params read_params;
	struct bt_gatt_discover_params discover_params;
	struct bt_aics_cb *cb;
	struct bt_conn *conn;
};

struct bt_aics_state {
	int8_t gain;
	uint8_t mute;
	uint8_t gain_mode;
	uint8_t change_counter;
} __packed;

struct bt_aics_gain_settings {
	uint8_t units;
	int8_t minimum;
	int8_t maximum;
} __packed;

enum bt_aics_notify {
	AICS_NOTIFY_STATE,
	AICS_NOTIFY_DESCRIPTION,
	AICS_NOTIFY_STATUS,
	AICS_NOTIFY_NUM,
};

struct bt_aics_server {
	struct bt_aics_state state;
	struct bt_aics_gain_settings gain_settings;
	bool initialized;
	uint8_t type;
	uint8_t status;
	struct bt_aics *inst;
	char description[BT_AICS_MAX_DESC_SIZE];
	struct bt_aics_cb *cb;

	struct bt_gatt_service *service_p;

	ATOMIC_DEFINE(notify, AICS_NOTIFY_NUM);
	struct k_work_delayable notify_work;
};

/* Struct used as a common type for the api */
struct bt_aics {
	bool client_instance;
	union {
		struct bt_aics_server srv;
		struct bt_aics_client cli;
	};

};

uint8_t aics_client_notify_handler(struct bt_conn *conn,
				   struct bt_gatt_subscribe_params *params,
				   const void *data, uint16_t length);
int bt_aics_client_register(struct bt_aics *inst);
int bt_aics_client_unregister(struct bt_aics *inst);
int bt_aics_client_state_get(struct bt_aics *inst);
int bt_aics_client_gain_setting_get(struct bt_aics *inst);
int bt_aics_client_type_get(struct bt_aics *inst);
int bt_aics_client_status_get(struct bt_aics *inst);
int bt_aics_client_unmute(struct bt_aics *inst);
int bt_aics_client_mute(struct bt_aics *inst);
int bt_aics_client_manual_gain_set(struct bt_aics *inst);
int bt_aics_client_automatic_gain_set(struct bt_aics *inst);
int bt_aics_client_gain_set(struct bt_aics *inst, int8_t gain);
int bt_aics_client_description_get(struct bt_aics *inst);
int bt_aics_client_description_set(struct bt_aics *inst,
				   const char *description);

#endif /* ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_AICS_INTERNAL_ */
