/** @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 <stdbool.h>
#include <stdint.h>

#include <zephyr/autoconf.h>
#include <zephyr/bluetooth/bluetooth.h>
#include <zephyr/bluetooth/gatt.h>
#include <zephyr/kernel.h>
#include <zephyr/sys/atomic.h>
#include <zephyr/types.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_ */
