package cn.iocoder.yudao.framework.common.util.string;

import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;

import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Random;

/**
 * 字符串工具类
 *
 * @author 芋道源码
 */
public class StrUtils {

    public static String maxLength(CharSequence str, int maxLength) {
        return StrUtil.maxLength(str, maxLength - 3); // -3 的原因，是该方法会补充 ... 恰好
    }

    /**
     * 给定字符串是否以任何一个字符串开始
     * 给定字符串和数组为空都返回 false
     *
     * @param str      给定字符串
     * @param prefixes 需要检测的开始字符串
     * @since 3.0.6
     */
    public static boolean startWithAny(String str, Collection<String> prefixes) {
        if (StrUtil.isEmpty(str) || ArrayUtil.isEmpty(prefixes)) {
            return false;
        }

        for (CharSequence suffix : prefixes) {
            if (StrUtil.startWith(str, suffix, false)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 获取随机字符串（字母大写）
     *
     * @param length
     * @return
     */
    public static String getRandomUpperString(int length) {
        String str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        char[] chars = new char[length];
        Random random = new SecureRandom();

        for (int index = 0; index < length; index++) {
            chars[index] = str.charAt(random.nextInt(str.length()));
        }

        return new String(chars);
    }

    /**
     * 获取随机字符串
     * @param length 字符串长度
     * @param type 类型： 0 纯数字 1 纯字母 2 混合类型
     * @return
     */
    public static String getRandomString(int length, int type) {
        String str = "";
        // 纯数字
        if (type == 0) {
            str = "0123456789";
            // 纯字母
        } else if (type == 1) {
            str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
            // 混合类型
        } else if (type == 2) {
            str = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        }

        char[] chars = new char[length];
        Random random = new SecureRandom();

        for (int index = 0; index < length; index++) {
            chars[index] = str.charAt(random.nextInt(str.length()));
        }

        return new String(chars);
    }

    /**
     * 获取随机字符串集合
     * @param length 字符串长度
     * @param type 类型： 0 纯数字 1 纯字母 2 混合类型
     * @param count 数量
     * @return
     */
    public static List<String> getRandomStringList(int length, int type, int count) {
        List<String> strList = new ArrayList<>();
        for(int i = 0; i < count; i++) {
            strList.add(StrUtils.getRandomString(length, type));
        }
        return strList;
    }

}
