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

#include "mocks/adv.h"
#include "mocks/hci_core.h"
#include "mocks/settings.h"
#include "mocks/settings_expects.h"
#include "testing_common_defs.h"

#include <zephyr/bluetooth/hci.h>
#include <zephyr/kernel.h>
#include <zephyr/ztest.h>

#include <host/hci_core.h>
#include <host/id.h>

ZTEST_SUITE(bt_id_delete_bt_settings, NULL, NULL, NULL, NULL, NULL);

/*
 *  Test deleting an ID, but not the last one
 *  As 'CONFIG_BT_SETTINGS' is enabled, settings should be saved by calling bt_settings_save_id()
 *  if 'BT_DEV_READY' flag in bt_dev.flags is set
 *
 *  Constraints:
 *   - ID value used is neither corresponds to default index nor the last index
 *   - 'CONFIG_BT_SETTINGS' is enabled
 *   - 'BT_DEV_READY' flag in bt_dev.flags is set
 *
 *  Expected behaviour:
 *   - bt_dev.id_addr[] at index equals to the ID value used is cleared
 *   - bt_dev.irk[] at index equals to the ID value used is cleared (if privacy is enabled)
 *   - bt_settings_save_id() is called to save settings
 *   - bt_dev.id_count is kept unchanged
 *   - bt_id_delete() returns 0
 */
ZTEST(bt_id_delete_bt_settings, test_delete_non_default_no_last_item_settings_enabled)
{
	int err;
	uint8_t id;
	int id_count;
#if defined(CONFIG_BT_PRIVACY)
	uint8_t zero_irk[16] = {0};
#endif

	Z_TEST_SKIP_IFNDEF(CONFIG_BT_SETTINGS);

	bt_dev.id_count = 3;
	id = 1;
	id_count = bt_dev.id_count;

	bt_addr_le_copy(&bt_dev.id_addr[0], BT_RPA_LE_ADDR);
	bt_addr_le_copy(&bt_dev.id_addr[1], BT_STATIC_RANDOM_LE_ADDR_1);
	bt_addr_le_copy(&bt_dev.id_addr[2], BT_STATIC_RANDOM_LE_ADDR_2);

	atomic_set_bit(bt_dev.flags, BT_DEV_READY);

	err = bt_id_delete(id);

	expect_single_call_bt_settings_save_id();

	zassert_ok(err, "Unexpected error code '%d' was returned", err);
	zassert_true(bt_dev.id_count == id_count, "Incorrect ID count %d was set", bt_dev.id_count);

	zassert_mem_equal(&bt_dev.id_addr[id], BT_ADDR_LE_ANY, sizeof(bt_addr_le_t),
			  "Incorrect address was set");
#if defined(CONFIG_BT_PRIVACY)
	zassert_mem_equal(bt_dev.irk[id], zero_irk, sizeof(zero_irk),
			  "Incorrect IRK value was set");
#endif
}

/*
 *  Test deleting last ID.
 *  As 'CONFIG_BT_SETTINGS' is enabled, settings should be saved by calling bt_settings_save_id()
 *  if 'BT_DEV_READY' flag in bt_dev.flags is set
 *
 *  Constraints:
 *   - ID value used corresponds to the last item in the list bt_dev.id_addr[]
 *   - 'CONFIG_BT_SETTINGS' is enabled
 *   - 'BT_DEV_READY' flag in bt_dev.flags is set
 *
 *  Expected behaviour:
 *   - bt_dev.id_addr[] at index equals to the ID value used is cleared
 *   - bt_dev.irk[] at index equals to the ID value used is cleared (if privacy is enabled)
 *   - bt_settings_save_id() is called to save settings
 *   - bt_dev.id_count is decremented
 *   - bt_id_delete() returns 0
 */
ZTEST(bt_id_delete_bt_settings, test_delete_last_id_settings_enabled)
{
	int err;
	uint8_t id;
	int id_count;
#if defined(CONFIG_BT_PRIVACY)
	uint8_t zero_irk[16] = {0};
#endif

	Z_TEST_SKIP_IFNDEF(CONFIG_BT_SETTINGS);

	bt_dev.id_count = 2;
	id = bt_dev.id_count - 1;
	id_count = bt_dev.id_count;

	bt_addr_le_copy(&bt_dev.id_addr[0], BT_STATIC_RANDOM_LE_ADDR_1);
	bt_addr_le_copy(&bt_dev.id_addr[1], BT_STATIC_RANDOM_LE_ADDR_2);

	atomic_set_bit(bt_dev.flags, BT_DEV_READY);

	err = bt_id_delete(id);

	expect_single_call_bt_settings_save_id();

	zassert_ok(err, "Unexpected error code '%d' was returned", err);
	zassert_true(bt_dev.id_count == (id_count - 1), "Incorrect ID count %d was set",
		     bt_dev.id_count);

	zassert_mem_equal(&bt_dev.id_addr[id], BT_ADDR_LE_ANY, sizeof(bt_addr_le_t),
			  "Incorrect address was set");
#if defined(CONFIG_BT_PRIVACY)
	zassert_mem_equal(bt_dev.irk[id], zero_irk, sizeof(zero_irk),
			  "Incorrect IRK value was set");
#endif
}
