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

/** @file
 *
 * @brief Utility functions to be used by the Wi-Fi subsystem.
 */

#ifndef ZEPHYR_INCLUDE_NET_WIFI_UTILS_H_
#define ZEPHYR_INCLUDE_NET_WIFI_UTILS_H_

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @addtogroup wifi_mgmt
 * @{
 */

/**
 * @name Wi-Fi utility functions.
 *
 * Utility functions for the Wi-Fi subsystem.
 * @{
 */

#define WIFI_UTILS_MAX_BAND_STR_LEN 3
#define WIFI_UTILS_MAX_CHAN_STR_LEN 4

/**
 * @brief Convert a band specification string to a bitmap representing the bands.
 *
 * @details The function will parse a string which specifies Wi-Fi frequency band
 * values as a comma separated string and convert it to a bitmap. The string can
 * use the following characters to represent the bands:
 *
 * - 2: 2.4 GHz
 * - 5: 5 GHz
 * - 6: 6 GHz
 *
 * For the bitmap generated refer to ::wifi_frequency_bands
 * for bit position of each band.
 *
 * E.g. a string "2,5,6" will be converted to a bitmap value of 0x7
 *
 * @param scan_bands_str String which spe.
 * @param band_map Pointer to the bitmap variable to be updated.
 *
 * @retval 0 on success.
 * @retval -errno value in case of failure.
 */
int wifi_utils_parse_scan_bands(char *scan_bands_str, uint8_t *band_map);


/**
 * @brief Append a string containing an SSID to an array of SSID strings.
 *
 * @param scan_ssids_str string to be appended in the list of scanned SSIDs.
 * @param ssids Pointer to an array where the SSIDs pointers are to be stored.
 * @param num_ssids Maximum number of SSIDs that can be stored.
 *
 * @retval 0 on success.
 * @retval -errno value in case of failure.
 */
int wifi_utils_parse_scan_ssids(char *scan_ssids_str,
				const char *ssids[],
				uint8_t num_ssids);


/**
 * @brief Convert a string containing a specification of scan channels to an array.
 *
 * @details The function will parse a string which specifies channels to be scanned
 * as a string and convert it to an array.
 *
 * The channel string has to be formatted using the colon (:), comma(,), hyphen (-) and
 * underscore (_) delimiters as follows:
 *	- A colon identifies the value preceding it as a band. A band value
 *	  (2: 2.4 GHz, 5: 5 GHz 6: 6 GHz) has to precede the channels in that band (e.g. 2: etc)
 *	- Hyphens (-) are used to identify channel ranges (e.g. 2-7, 32-48 etc)
 *	- Commas are used to separate channel values within a band. Channels can be specified
 *	  as individual values (2,6,48 etc) or channel ranges using hyphens (1-14, 32-48 etc)
 *	- Underscores (_) are used to specify multiple band-channel sets (e.g. 2:1,2_5:36,40 etc)
 *	- No spaces should be used anywhere, i.e. before/after commas,
 *	  before/after hyphens etc.
 *
 * An example channel specification specifying channels in the 2.4 GHz and 5 GHz bands is
 * as below:
 *	2:1,5,7,9-11_5:36-48,100,163-167
 *
 * @param scan_chan_str List of channels expressed in the format described above.
 * @param chan Pointer to an array where the parsed channels are to be stored.
 * @param max_channels Maximum number of channels to store
 *
 * @retval 0 on success.
 * @retval -errno value in case of failure.
 */
int wifi_utils_parse_scan_chan(char *scan_chan_str,
			       struct wifi_band_channel *chan,
			       uint8_t max_channels);


/**
 * @brief Validate a channel against a band.
 *
 * @param band Band to validate the channel against.
 * @param chan Channel to validate.
 *
 * @retval true if the channel is valid for the band.
 * @retval false if the channel is not valid for the band.
 */
bool wifi_utils_validate_chan(uint8_t band,
			      uint16_t chan);

/**
 * @brief Validate a channel against the 2.4 GHz band.
 *
 * @param chan Channel to validate.
 *
 * @retval true if the channel is valid for the band.
 * @retval false if the channel is not valid for the band.
 */
bool wifi_utils_validate_chan_2g(uint16_t chan);

/**
 * @brief Validate a channel against the 5 GHz band.
 *
 * @param chan Channel to validate.
 *
 * @retval true if the channel is valid for the band.
 * @retval false if the channel is not valid for the band.
 */
bool wifi_utils_validate_chan_5g(uint16_t chan);

/**
 * @brief Validate a channel against the 6 GHz band.
 *
 * @param chan Channel to validate.
 *
 * @retval true if the channel is valid for the band.
 * @retval false if the channel is not valid for the band.
 */
bool wifi_utils_validate_chan_6g(uint16_t chan);

/**
 * @}
 */

/**
 * @}
 */

#ifdef __cplusplus
}
#endif
#endif /* ZEPHYR_INCLUDE_NET_WIFI_UTILS_H_ */
