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

#include <zephyr/zephyr.h>
#include <stddef.h>
#include <zephyr/ztest.h>

#include <zephyr/bluetooth/bluetooth.h>
#include <zephyr/bluetooth/hci.h>
#include <host/hci_core.h>

#include <util/util.h>
#include <util/memq.h>
#include <util/dbuf.h>

#include <pdu.h>
#include <lll.h>
#include <lll_scan.h>
#include <lll/lll_df_types.h>
#include <lll_sync.h>
#include <ull_scan_types.h>
#include <ull_scan_internal.h>
#include <ull_sync_types.h>
#include <ull_sync_internal.h>

struct bt_le_per_adv_sync *g_per_sync;

static struct bt_le_per_adv_sync_param g_sync_create_param;

void common_create_per_sync_set(void)
{
	struct ll_scan_set *scan;
	struct ll_sync_set *sync;
	int err;

	bt_addr_le_copy(&g_sync_create_param.addr, BT_ADDR_LE_NONE);
	g_sync_create_param.options = 0;
	g_sync_create_param.sid = 0;
	g_sync_create_param.skip = 0;
	g_sync_create_param.timeout = 0xa;

	err = bt_le_per_adv_sync_create(&g_sync_create_param, &g_per_sync);
	zassert_equal(err, 0, "Failed to create periodic sync set");

	/* Below code makes fake sync enable and provides appropriate handle value to
	 * g_per_sync->handle. There is no complete sync established procedure,
	 * because it is not required to test DF functionality.
	 */
	scan = ull_scan_set_get(SCAN_HANDLE_1M);
	sync = scan->periodic.sync;
	g_per_sync->handle = ull_sync_handle_get(sync);
	sync->lll.phy = PHY_2M;
	/* timeout_reload member is used by controller to check if sync was established. */
	sync->timeout_reload = 1;
}
