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

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

#include <zephyr/bluetooth/hci.h>
#include <zephyr/sys/byteorder.h>
#include <zephyr/sys/slist.h>
#include <zephyr/sys/util.h>
#include "hal/ccm.h"

#include "util/util.h"
#include "util/mem.h"
#include "util/memq.h"
#include "util/dbuf.h"

#include "pdu_df.h"
#include "lll/pdu_vendor.h"
#include "pdu.h"
#include "ll.h"
#include "ll_settings.h"

#include "lll.h"
#include "lll/lll_df_types.h"
#include "lll_conn.h"
#include "lll_conn_iso.h"

#include "ull_tx_queue.h"

#include "isoal.h"
#include "ull_iso_types.h"
#include "ull_conn_iso_types.h"
#include "ull_conn_types.h"
#include "ull_llcp.h"
#include "ull_conn_internal.h"
#include "ull_llcp_internal.h"

#include "helper_pdu.h"
#include "helper_util.h"

static struct ll_conn conn;

static void cis_terminate_setup(void *data)
{
	test_setup(&conn);
}

static void test_cis_terminate_rem(uint8_t role)
{
	struct pdu_data_llctrl_cis_terminate_ind remote_cis_terminate_ind;

	/* Role */
	test_set_role(&conn, role);

	/* Connect */
	ull_cp_state_set(&conn, ULL_CP_CONNECTED);

	/* Prepare */
	event_prepare(&conn);

	/* Rx */
	lt_tx(LL_CIS_TERMINATE_IND, &conn, &remote_cis_terminate_ind);

	/* Done */
	event_done(&conn);

	/* There should be no host notification */
	ut_rx_q_is_empty();

	zassert_equal(llcp_ctx_buffers_free(), test_ctx_buffers_cnt(),
		      "Free CTX buffers %d", llcp_ctx_buffers_free());
}

ZTEST(cis_terminate, test_cis_terminate_cen_rem)
{
	test_cis_terminate_rem(BT_HCI_ROLE_CENTRAL);
}

ZTEST(cis_terminate, test_cis_terminate_per_rem)
{
	test_cis_terminate_rem(BT_HCI_ROLE_PERIPHERAL);
}

void test_cis_terminate_loc(uint8_t role)
{
	uint8_t err;
	struct node_tx *tx;
	struct ll_conn_iso_stream cis = { 0 };
	struct ll_conn_iso_group group = { 0 };

	struct pdu_data_llctrl_cis_terminate_ind local_cis_terminate_ind = {
		.cig_id = 0x03,
		.cis_id = 0x04,
		.error_code = 0x06,
	};

	/* Role */
	test_set_role(&conn, role);

	/* Connect */
	ull_cp_state_set(&conn, ULL_CP_CONNECTED);

	/* Mock CIS/ACL */
	cis.lll.acl_handle = conn.lll.handle;
	group.cig_id = local_cis_terminate_ind.cig_id;
	cis.cis_id = local_cis_terminate_ind.cis_id;
	cis.group = &group;

	/* Initiate an CIS Terminate Procedure */
	err = ull_cp_cis_terminate(&conn, &cis, local_cis_terminate_ind.error_code);
	zassert_equal(err, BT_HCI_ERR_SUCCESS);

	/* Prepare */
	event_prepare(&conn);

	lt_rx_q_is_empty(&conn);

	/* Done */
	event_done(&conn);

	/* 'Signal' CIS terminated */
	conn.llcp.cis.terminate_ack = 1;

	/* Prepare */
	event_prepare(&conn);

	/* Tx Queue should now have one LL Control PDU */
	lt_rx(LL_CIS_TERMINATE_IND, &conn, &tx, &local_cis_terminate_ind);
	lt_rx_q_is_empty(&conn);

	/* RX Ack */
	event_tx_ack(&conn, tx);

	/* Done */
	event_done(&conn);

	/* Release tx node */
	ull_cp_release_tx(&conn, tx);

	/* There should be no host notification */
	ut_rx_q_is_empty();

	zassert_equal(llcp_ctx_buffers_free(), test_ctx_buffers_cnt(),
		      "Free CTX buffers %d", llcp_ctx_buffers_free());
}

ZTEST(cis_terminate, test_cis_terminate_cen_loc)
{
	test_cis_terminate_loc(BT_HCI_ROLE_CENTRAL);
}

ZTEST(cis_terminate, test_cis_terminate_per_loc)
{
	test_cis_terminate_loc(BT_HCI_ROLE_PERIPHERAL);
}

ZTEST_SUITE(cis_terminate, NULL, NULL, cis_terminate_setup, NULL, NULL);
