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

#include <zephyr/types.h>
#include <zephyr/bluetooth/audio/pacs.h>

#include "pacs.h"

/* List of fakes used by this unit tester */
#define PACS_FFF_FAKES_LIST(FAKE) \
	FAKE(bt_pacs_cap_foreach) \
	FAKE(bt_pacs_get_available_contexts_for_conn) \

static const struct bt_audio_codec_cap lc3_codec = BT_AUDIO_CODEC_CAP_LC3(
	BT_AUDIO_CODEC_CAP_FREQ_ANY, BT_AUDIO_CODEC_CAP_DURATION_10,
	BT_AUDIO_CODEC_CAP_CHAN_COUNT_SUPPORT(1), 40u, 120u, 1u,
	(BT_AUDIO_CONTEXT_TYPE_CONVERSATIONAL | BT_AUDIO_CONTEXT_TYPE_MEDIA));

DEFINE_FAKE_VOID_FUNC(bt_pacs_cap_foreach, enum bt_audio_dir, bt_pacs_cap_foreach_func_t, void *);
DEFINE_FAKE_VALUE_FUNC(enum bt_audio_context, bt_pacs_get_available_contexts_for_conn,
		       struct bt_conn *, enum bt_audio_dir);

static void pacs_cap_foreach_custom_fake(enum bt_audio_dir dir, bt_pacs_cap_foreach_func_t func,
					 void *user_data)
{
	static const struct bt_pacs_cap cap[] = {
		{
			&lc3_codec,
		},
	};

	for (size_t i = 0; i < ARRAY_SIZE(cap); i++) {
		if (func(&cap[i], user_data) == false) {
			break;
		}
	}
}

void mock_bt_pacs_init(void)
{
	PACS_FFF_FAKES_LIST(RESET_FAKE);
	bt_pacs_cap_foreach_fake.custom_fake = pacs_cap_foreach_custom_fake;
}

void mock_bt_pacs_cleanup(void)
{

}
