package com.ruoyi.common.utils;

import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;

/**
 * 随机字符串生成工具类
 * 生成指定长度的字母和数字组合（排除 I、O、1、0）
 */
public class RandomStringUtil {

    // 定义可用字符集：字母（排除 I、O）+ 数字（排除 1、0）
    private static final String VALID_CHARACTERS = "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjklmnpqrstuvwxyz23456789";

    // 随机数实例（使用线程安全的方式，避免多线程下重复）
    private static final Random RANDOM = new Random();

    // 定义字符池：大写字母 + 数字（共 36 个字符）
    private static final String CHARACTER_POOL = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    // 目标字符串长度
    private static final int LENGTH = 8;

    /**
     * 生成 8 位随机组合字符串
     * @return 8位随机字符串（含大小写字母、数字，排除 I、O、1、0）
     */
    public static String generateRandomString() {
        return generateRandomString(8);
    }

    /**
     * 生成指定长度的随机组合字符串
     * @param length 目标字符串长度（需大于0）
     * @return 指定长度的随机字符串
     * @throws IllegalArgumentException 若长度小于等于0，抛出非法参数异常
     */
    public static String generateRandomString(int length) {
        if (length <= 0) {
            throw new IllegalArgumentException("字符串长度必须大于0");
        }

        StringBuilder sb = new StringBuilder(length);
        int validLength = VALID_CHARACTERS.length();

        for (int i = 0; i < length; i++) {
            // 随机获取字符集中的索引，拼接字符
            int randomIndex = RANDOM.nextInt(validLength);
            sb.append(VALID_CHARACTERS.charAt(randomIndex));
        }

        return sb.toString();
    }

    /**
     * 生成 8 位随机大写字母 + 数字的字符串
     * @return 随机字符串（如：K3P7A9Z2）
     */
    public static String generateRandomUUIDString() {
        // 获取 ThreadLocalRandom 实例（线程安全）
        ThreadLocalRandom random = ThreadLocalRandom.current();
        // 用 StringBuilder 拼接字符（高效）
        StringBuilder sb = new StringBuilder(LENGTH);

        for (int i = 0; i < LENGTH; i++) {
            // 随机生成 0-35 的索引（对应字符池的长度）
            int index = random.nextInt(CHARACTER_POOL.length());
            // 根据索引获取字符并追加
            sb.append(CHARACTER_POOL.charAt(index));
        }

        return sb.toString();
    }

    /**
     * 获取 0（包含）到 指定数字n（不包含）之间的随机整数
     * @param n 上限数字（不包含），要求 n > 0
     * @return 随机整数
     * @throws IllegalArgumentException 当n≤0时抛出异常
     */
    public static int getRandomNumberWithin(int n) {
        // 校验参数合法性
        if (n <= 0) {
            throw new IllegalArgumentException("指定数字必须大于0");
        }
        // 创建Random实例（若频繁调用，建议将Random声明为类成员变量，避免频繁创建）
        Random random = new Random();
        // nextInt(n) 会返回 0 ≤ 随机数 < n 的整数
        return random.nextInt(n);
    }

}
