Source: numberUtils.js

/**
 * Checks if a number is even
 * @param {number} number - The number to check.
 * @returns {boolean | undefined} True if the number is even, false otherwise. Returns undefined if the input is not a valid number.
 */
export function isEven(number) {
    if (typeof number !== 'number' || isNaN(number)) {
        console.error("isEven: Input must be a valid number.");
        return undefined;
    }

    return number % 2 === 0;
}

/**
 * Checks if a number is odd
 * @param {number} number - The number to check.
 * @returns {boolean | undefined} True if the number is odd, false otherwise. Returns undefined if the input is not a valid number.
 */
export function isOdd(number) {
    if (typeof number !== 'number' || isNaN(number)) {
        console.error("isOdd: Input must be a valid number.");
        return undefined;
    }

    return number % 2 !== 0;
}

/**
 * Rounds a number to a specified number of decimal places
 * @param {number} number - The number to round.
 * @param {number} decimalPlaces - The number of decimal places to round to. Defaults to 0.
 * @returns {number | NaN} The rounded number.Returns NaN if the inputs are not valid numbers.
 */
export function roundTo(number, decimalPlaces) {
    if (typeof number !== 'number' || isNaN(number)) {
        console.error("roundTo: Input number must be valid number.");
        return NaN;
    }

    if (typeof decimalPlaces !== 'number' || isNaN(decimalPlaces)) {
        console.error("roundTo: Input decimalPlaces must be a valid number.");
        return NaN;
    }

    if (decimalPlaces < 0) {
        console.error("roundTo: decimalPlaces must be a non-negative number.");
        return NaN;
    }

    return Number(number.toFixed(decimalPlaces));
}

/**
 * Generates a random integer within a specified range (inclusive)
 * @param {number} min - The minimum value of the range.
 * @param {number} max - The maximum value of the range.
 * @returns {number | NaN} A random integer between min and max (inclusive), or NaN if min or max are not valid numbers.
 */
export function getRandomInt(min, max) {
    if (typeof min !== 'number' || typeof max !== 'number' || isNaN(min) || isNaN(max)) {
        console.error("getRandomInt: min and max must be valid numbers");
        return NaN;
    }

    min = Math.ceil(min);
    max = Math.floor(max);

    if (min > max) {
        console.warn("getRandomInt: min cannot be greater than max. Swapping values.");
        [min, max] = [max, min];
    }

    return Math.floor(Math.random() * (max - min + 1)) + min;
}


/**
 * Returns the sum of all numbers in an array
 * @param {numbers[]} numbers - An array of numbers.
 * @returns {number | NaN} An integer value representing the sum of all numbers in the array, or NaN if not a valid array or if any element of the array is not a number.
 */
export function sum(numbers) {
    if (!Array.isArray(numbers)) {
        console.error("sum: Input is not an array.");
        return NaN;
    }

    if (numbers.length === 0) {
        return 0;
    }

    let total = 0;
    for (let i = 0; i < numbers.length; i++) {
        const num = numbers[i];

        if (typeof num !== 'number' || isNaN(num)) {
            console.error("sum: Array elements must be numbers.");
            return NaN;
        }

        total += num;
    }

    return total;
}