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

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

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

#include "common.h"

struct bt_le_ext_adv *g_adv;
struct bt_le_adv_param g_param = BT_LE_ADV_PARAM_INIT(
	(BT_LE_ADV_OPT_EXT_ADV | BT_LE_ADV_OPT_NOTIFY_SCAN_REQ),
	BT_GAP_ADV_FAST_INT_MIN_2, BT_GAP_ADV_FAST_INT_MAX_2, NULL);

/* Example cte length value in allowed range, no particular meaning */
uint8_t g_cte_len = 0x14U;

static struct bt_le_per_adv_param per_param = {
	.interval_min = BT_GAP_ADV_SLOW_INT_MIN,
	.interval_max = BT_GAP_ADV_SLOW_INT_MAX,
	.options = BT_LE_ADV_OPT_USE_TX_POWER,
};

static struct bt_le_ext_adv_start_param ext_adv_start_param = {
	.timeout = 0,
	.num_events = 0,
};

void common_create_adv_set(void)
{
	int err;

	err = bt_le_ext_adv_create(&g_param, NULL, &g_adv);
	zassert_equal(err, 0, "Failed to create advertiser set");
}

void common_delete_adv_set(void)
{
	int err;

	err = bt_le_ext_adv_delete(g_adv);
	zassert_equal(err, 0, "Failed to delete advertiser set");
}

void common_set_cl_cte_tx_params(void)
{
	uint8_t ant_ids[] = { 0x1, 0x2, 0x3, 0x4, 0x5 };

	struct bt_hci_cp_le_set_cl_cte_tx_params *cp;
	uint8_t *dest_ant_ids;
	struct net_buf *buf;
	int err;

	buf = bt_hci_cmd_create(BT_HCI_OP_LE_SET_CL_CTE_TX_PARAMS,
				sizeof(*cp) + ARRAY_SIZE(ant_ids));
	zassert_not_null(buf, "Failed to create HCI cmd object");

	cp = net_buf_add(buf, sizeof(*cp));
	cp->handle = g_adv->handle;
	cp->cte_len = g_cte_len;
	cp->cte_type = BT_HCI_LE_AOD_CTE_2US;
	cp->cte_count = 5;

	dest_ant_ids = net_buf_add(buf, ARRAY_SIZE(ant_ids));
	memcpy(dest_ant_ids, ant_ids, ARRAY_SIZE(ant_ids));

	cp->switch_pattern_len = ARRAY_SIZE(ant_ids);

	err = bt_hci_cmd_send_sync(BT_HCI_OP_LE_SET_CL_CTE_TX_PARAMS, buf,
				   NULL);
	zassert_equal(err, 0, "Failed to  set CTE parameters");
}

void common_set_adv_params(void)
{
	int err;

	err = bt_le_per_adv_set_param(g_adv, &per_param);
	zassert_equal(err, 0, "Failed to set periodic advertising params");
}

void common_per_adv_enable(void)
{
	int err;

	err = bt_le_per_adv_start(g_adv);
	zassert_equal(err, 0, "Failed to start periodic advertising");

	err = bt_le_ext_adv_start(g_adv, &ext_adv_start_param);
	zassert_equal(err, 0, "Failed to start extended advertising");
}

void common_per_adv_disable(void)
{
	int err;

	err = bt_le_per_adv_stop(g_adv);
	zassert_equal(err, 0, "Failed to stop periodic advertising");

	err = bt_le_ext_adv_stop(g_adv);
	zassert_equal(err, 0, "Failed to stop extended advertising");
}
