/**
 * 随机工具函数库
 * 提供生成随机数、随机字符串、随机数组等功能。
 */

/**
 * 生成一个指定范围内的随机整数 (包含 min 和 max)
 * @param min 最小值 (包含)
 * @param max 最大值 (包含)
 */
export const getRandomInt = (min: number, max: number): number => {
    const minimum = Math.ceil(min);
    const maximum = Math.floor(max);
    return Math.floor(Math.random() * (maximum - minimum + 1)) + minimum;
};

/**
 * 生成一个指定长度的随机字符串
 * @param length 随机字符串的长度
 * @param chars 可选，使用的字符集，默认是字母 (大小写) 和数字
 */
export const getRandomString = (length: number, chars: string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'): string => {
    let result = '';
    const charsLength = chars.length;
    for (let i = 0; i < length; i++) {
        result += chars.charAt(Math.floor(Math.random() * charsLength));
    }
    return result;
};

/**
 * 生成一个随机布尔值 (true 或 false)
 */
export const getRandomBoolean = (): boolean => {
    return Math.random() >= 0.5;
};

/**
 * 从数组中随机选取一个值
 * @param array 要随机提取的数组
 */
export const getRandomFromArray = <T>(array: T[]): T => {
    return array[Math.floor(Math.random() * array.length)];
};

/**
 * 打乱一个数组
 * @param array 要打乱的数组
 */
export const shuffleArray = <T>(array: T[]): T[] => {
    const shuffled = [...array]; // 创建一个副本以免修改原数组
    for (let i = shuffled.length - 1; i > 0; i--) {
        const j = Math.floor(Math.random() * (i + 1));
        [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];
    }
    return shuffled;
};

/**
 * 生成一个随机的十六进制颜色代码 (如 "#a1b2c3")
 */
export const getRandomHexColor = (): string => {
    return `#${Math.floor(Math.random() * 0xffffff).toString(16).padStart(6, '0')}`;
};

/**
 * 生成一个随机RGBA颜色
 * @param alpha 可选，透明度 (范围 0-1)
 */
export const getRandomRGBAColor = (alpha: number = 1): string => {
    const r = getRandomInt(0, 255);
    const g = getRandomInt(0, 255);
    const b = getRandomInt(0, 255);
    return `rgba(${r}, ${g}, ${b}, ${alpha})`;
};

/**
 * 随机延迟一段时间 (返回一个 Promise，在随机时间后 resolve)
 * @param min 最小延迟时间 (毫秒)
 * @param max 最大延迟时间 (毫秒)
 */
export const randomDelay = (min: number, max: number): Promise<void> => {
    const delay = getRandomInt(min, max);
    return new Promise(resolve => setTimeout(resolve, delay));
};