package com.usky.common.core.util;

import java.util.UUID;
import java.util.stream.IntStream;

/**
 * <p>UUID 工具类</p>
 *
 * @author chenpeng
 * Create at February 11, 2019 at 17:49:24 GMT+8
 */
public final class UUIDUtils {

    /**
     * 16 进制
     */
    private static final int HEXADECIMAL = 16;
    /**
     * 短 uuid 默认长度
     */
    private static final int SHORT_UUID_LENGTH = 8;
    /**
     * 字符表
     */
    private static final String[] CODES = new String[]{"a", "b", "c", "d", "e", "f",
            "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s",
            "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5",
            "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I",
            "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",
            "W", "X", "Y", "Z"};
    /**
     * 字符表长度
     */
    private static final int CODES_LENTH = CODES.length;
    /**
     * UUID 分隔符
     */
    private static final String UUID_SEPARATOR = "-";

    private UUIDUtils() {
    }

    /**
     * 获得 uuid，默认不带分隔符 “-”
     */
    public static String uuid() {
        return uuid(true);
    }

    /**
     * 通过给定参数指定返回 uuid 是否带有分隔符
     *
     * @param withoutSeparator 是否带分隔符
     * @return String
     */
    public static String uuid(boolean withoutSeparator) {
        String uuid = UUID.randomUUID().toString();
        if (withoutSeparator) {
            uuid = uuid.replaceAll(UUID_SEPARATOR, StringUtils.EMPTY);
        }
        return uuid;
    }

    /**
     * 获取短 uuid
     *
     * @return String
     */
    public static String shortUUID() {

        StringBuilder shortUUID = new StringBuilder();

        String uuid = uuid();
        int step = uuid.length() / SHORT_UUID_LENGTH;

        IntStream.range(0, SHORT_UUID_LENGTH).forEach(i -> {
            String temp = uuid.substring(i * step, i * step + step);
            int value = Integer.parseInt(temp, HEXADECIMAL);
            shortUUID.append(CODES[value % CODES_LENTH]);
        });

        return shortUUID.toString();
    }
}
