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

#include <stdint.h>
#include <stddef.h>
#include <string.h>

#include <zephyr/toolchain.h>
#include <zephyr/sys/util.h>

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

#include "hal/ccm.h"

#include "pdu.h"

#include "lll.h"
#include "lll/lll_adv_types.h"
#include "lll_adv.h"
#include "lll/lll_adv_pdu.h"
#include "lll/lll_df_types.h"
#include "lll_conn.h"

#include "ull_adv_types.h"

#include "ull_adv_internal.h"
#include "ull_central_internal.h"

/* Initial channel map indicating Used and Unused data channels.
 * The HCI LE Set Host Channel Classification command allows the Host to
 * specify a channel classification for the data, secondary advertising,
 * periodic, and isochronous physical channels based on its local information.
 */
static uint8_t map[5] = {0xFF, 0xFF, 0xFF, 0xFF, 0x1F};
static uint8_t count = 37U;

static void chan_map_set(uint8_t const *const chan_map);

uint8_t ll_chm_update(uint8_t const *const chm)
{
	chan_map_set(chm);

#if defined(CONFIG_BT_CENTRAL)
	(void)ull_central_chm_update();
#endif /* CONFIG_BT_CENTRAL */

#if (CONFIG_BT_CTLR_ADV_AUX_SET > 0)
	(void)ull_adv_aux_chm_update();
#endif /*(CONFIG_BT_CTLR_ADV_AUX_SET > 0) */

#if defined(CONFIG_BT_CTLR_ADV_PERIODIC)
	(void)ull_adv_sync_chm_update();
#endif /* CONFIG_BT_CTLR_ADV_PERIODIC */

#if defined(CONFIG_BT_CTLR_ADV_ISO)
	(void)ull_adv_iso_chm_update();
#endif /* CONFIG_BT_CTLR_ADV_ISO */

	/* TODO: Should failure due to Channel Map Update being already in
	 *       progress be returned to caller?
	 */
	return 0;
}

int ull_chan_reset(void)
{
	/* initialise connection channel map */
	map[0] = 0xFF;
	map[1] = 0xFF;
	map[2] = 0xFF;
	map[3] = 0xFF;
	map[4] = 0x1F;
	count = 37U;

	return 0;
}

uint8_t ull_chan_map_get(uint8_t *const chan_map)
{
	(void)memcpy(chan_map, map, sizeof(map));

	return count;
}

static void chan_map_set(uint8_t const *const chan_map)
{
	(void)memcpy(map, chan_map, sizeof(map));
	count = util_ones_count_get(map, sizeof(map));
}
