package com.trade.common.utils.uuid;

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import com.trade.common.utils.DateUtils;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Random;

/**
 * 业务编号生成规则
 */
public class BizNoUtil {

    private static final String CREDIT_APPLY_NO_PREFIX = "A";
    private static final String SALES_CONTRACT_APPLY_NO_PREFIX = "SC";
    /**
     * 销售订单号前缀
     */
    public static final String SALE_ORDER_NO_PREFIX = "SO";

    /**
     * 生成授信申请编号 时间戳 + 一位随机数
     * 
     * @return 授信申请编号
     */
    public static String generateCreditApplyNo() {
        return CREDIT_APPLY_NO_PREFIX + DateUtil.format(new Date(), DatePattern.PURE_DATETIME_MS_FORMAT)
                + getRandomNum(1);
    }

    /**
     * 生成销售合同编号 时间戳 + 两位随机数
     * 
     * @return 销售合同编号
     */
    public static String generateSalesContractNo() {
        return SALES_CONTRACT_APPLY_NO_PREFIX + DateUtils.parseDateToStr(DateUtils.YYYYMMDDHHMM, new Date())
                + getRandomNum(2);
    }

    /**
     * 生成供应商编号 7位随机数
     *
     * @return 供应商编号
     */
    public static String generateVendorEntityNo() {
        return getRandomNum(7);
    }

    /**
     * 生成销售订单编号 时间戳 + 两位随机数
     *
     * @return 订单编号
     */
    public static String generateSaleOrderNo() {
        return SALE_ORDER_NO_PREFIX + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))
                + getRandomNum(2);
    }

    /**
     * 生成业务编号
     * 
     * @param prefix 前缀
     * @param len 随机数字
     * @return 业务编号
     */
    public static String generateBusinessNumber(String prefix, int len) {
        return prefix + getRandomNum(len);
    }

    /**
     * 生成随机数
     *
     * @param len 随机数长度
     * @return 随机数
     */
    private static String getRandomNum(int len) {
        String base = "0123456789";
        Random random = new Random();
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < len; ++i) {
            int number = random.nextInt(base.length());
            stringBuilder.append(base.charAt(number));
        }
        return stringBuilder.toString();
    }
}
