/*
 * Copyright 2023 NXP
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr/bluetooth/bluetooth.h>
#include <zephyr/bluetooth/audio/audio.h>
#include <zephyr/bluetooth/audio/vcp.h>

static struct bt_vcp_vol_ctlr *vol_ctlr;

static void vcs_discover_cb(struct bt_vcp_vol_ctlr *vol_ctlr, int err,
			    uint8_t vocs_count, uint8_t aics_count)
{
	if (err != 0) {
		printk("VCP: Service could not be discovered (%d)\n", err);
		return;
	}
}

static void vcs_write_cb(struct bt_vcp_vol_ctlr *vol_ctlr, int err)
{
	if (err != 0) {
		printk("VCP: Write failed (%d)\n", err);
		return;
	}
}

static void vcs_state_cb(struct bt_vcp_vol_ctlr *vol_ctlr, int err,
			 uint8_t volume, uint8_t mute)
{
	if (err != 0) {
		printk("VCP: state cb err (%d)", err);
		return;
	}

	printk("VCS volume %u, mute %u\n", volume, mute);
}

static void vcs_flags_cb(struct bt_vcp_vol_ctlr *vol_ctlr, int err,
			 uint8_t flags)
{
	if (err != 0) {
		printk("VCP: flags cb err (%d)", err);
		return;
	}

	printk("VCS flags 0x%02X\n", flags);
}

static struct bt_vcp_vol_ctlr_cb vcp_cbs = {
	.discover = vcs_discover_cb,
	.vol_down = vcs_write_cb,
	.vol_up = vcs_write_cb,
	.mute = vcs_write_cb,
	.unmute = vcs_write_cb,
	.vol_down_unmute = vcs_write_cb,
	.vol_up_unmute = vcs_write_cb,
	.vol_set = vcs_write_cb,
	.state = vcs_state_cb,
	.flags = vcs_flags_cb,
};

static int process_profile_connection(struct bt_conn *conn)
{
	int err = 0;

	err = bt_vcp_vol_ctlr_discover(conn, &vol_ctlr);

	if (err != 0) {
		printk("bt_vcp_vol_ctlr_discover (err %d)\n", err);
	}

	return err;
}

static void connected(struct bt_conn *conn, uint8_t err)
{
	if (err) {
		printk("Connection failed (err %d)\n", err);
		return;
	}

	if (process_profile_connection(conn) != 0) {
		printk("Profile connection failed");
	}
}

BT_CONN_CB_DEFINE(conn_callbacks) = {
	.connected = connected,
};

int vcp_vol_ctlr_init(void)
{
	int err;

	err = bt_vcp_vol_ctlr_cb_register(&vcp_cbs);
	if (err != 0) {
		printk("CB register failed (err %d)\n", err);
	}

	return err;
}

int vcp_vol_ctlr_mute(void)
{
	int err;

	if (vol_ctlr != NULL) {
		err = bt_vcp_vol_ctlr_mute(vol_ctlr);
	} else {
		err = -EINVAL;
	}

	return err;
}

int vcp_vol_ctlr_unmute(void)
{
	int err;

	if (vol_ctlr != NULL) {
		err = bt_vcp_vol_ctlr_unmute(vol_ctlr);
	} else {
		err = -EINVAL;
	}

	return err;
}

int vcp_vol_ctlr_set_vol(uint8_t volume)
{
	int err;

	if (vol_ctlr != NULL) {
		err = bt_vcp_vol_ctlr_set_vol(vol_ctlr, volume);
	} else {
		err = -EINVAL;
	}

	return err;
}
