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

#ifdef CONFIG_BT_HAS
#include <zephyr/bluetooth/gatt.h>
#include <zephyr/bluetooth/audio/has.h>

#include "common.h"

extern enum bst_result_t bst_result;

const uint8_t test_preset_index_1 = 0x01;
const uint8_t test_preset_index_5 = 0x05;
const char *test_preset_name_1 = "test_preset_name_1";
const char *test_preset_name_5 = "test_preset_name_5";
const enum bt_has_properties test_preset_properties = BT_HAS_PROP_AVAILABLE;

static int preset_select(uint8_t index, bool sync)
{
	return 0;
}

static const struct bt_has_preset_ops preset_ops = {
	.select = preset_select,
};

static void test_main(void)
{
	struct bt_has_features_param has_param = {0};
	struct bt_has_preset_register_param preset_param;

	int err;

	err = bt_enable(NULL);
	if (err) {
		FAIL("Bluetooth enable failed (err %d)\n", err);
		return;
	}

	printk("Bluetooth initialized\n");

	err = bt_le_adv_start(BT_LE_ADV_CONN_NAME, ad, AD_SIZE, NULL, 0);
	if (err) {
		FAIL("Advertising failed to start (err %d)\n", err);
		return;
	}

	printk("Advertising successfully started\n");

	has_param.type = BT_HAS_HEARING_AID_TYPE_BINAURAL;
	has_param.preset_sync_support = true;

	err = bt_has_register(&has_param);
	if (err) {
		FAIL("HAS register failed (err %d)\n", err);
		return;
	}

	has_param.type = BT_HAS_HEARING_AID_TYPE_MONAURAL;
	has_param.preset_sync_support = false;

	err = bt_has_features_set(&has_param);
	if (err) {
		FAIL("HAS register failed (err %d)\n", err);
		return;
	}

	preset_param.index = test_preset_index_5;
	preset_param.properties = test_preset_properties;
	preset_param.name = test_preset_name_5;
	preset_param.ops = &preset_ops,

	err = bt_has_preset_register(&preset_param);
	if (err) {
		FAIL("Preset register failed (err %d)\n", err);
		return;
	}

	preset_param.index = test_preset_index_1;
	preset_param.properties = test_preset_properties;
	preset_param.name = test_preset_name_1;

	err = bt_has_preset_register(&preset_param);
	if (err) {
		FAIL("Preset register failed (err %d)\n", err);
		return;
	}

	printk("Presets registered\n");

	PASS("HAS passed\n");
}

static const struct bst_test_instance test_has[] = {
	{
		.test_id = "has",
		.test_post_init_f = test_init,
		.test_tick_f = test_tick,
		.test_main_f = test_main,
	},
	BSTEST_END_MARKER,
};

struct bst_test_list *test_has_install(struct bst_test_list *tests)
{
	return bst_add_tests(tests, test_has);
}
#else
struct bst_test_list *test_has_install(struct bst_test_list *tests)
{
	return tests;
}

#endif /* CONFIG_BT_HAS */
