package com.zg.project.wisdom.utils;

import com.zg.project.wisdom.mapper.RkInfoMapper;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ThreadLocalRandom;

/**
 * 单据号生成工具类
 *
 * 目标：
 * 1) 每次业务操作都生成全新单据号（不依赖历史，不查DB）
 * 2) 单号短、可读
 * 3) 避免串单：不同出库操作绝不复用同一个 billNo
 *
 * 推荐格式：
 * CK24011315384227
 * 前缀 + yyMMdd + HHmmss + 2位随机数
 */
public class BillNoUtil {

    private static final String DEFAULT_PREFIX = "RK";

    /**
     * 生成单据号（短号，不查数据库）
     * 格式：PREFIX + yyMMdd + HHmmss + 2位随机数
     * 示例：CK24011315384227
     *
     * @param prefix      单据前缀：RK/CK/...
     * @param rkInfoMapper 兼容旧签名（不再使用，可传 null）
     */
    public static synchronized String generateTodayBillNo(String prefix, RkInfoMapper rkInfoMapper) {

        // 前缀处理
        final String p = (prefix == null || prefix.trim().isEmpty())
                ? DEFAULT_PREFIX
                : prefix.trim().toUpperCase();

        // 时间到秒：yyMMddHHmmss（12位）
        String time = new SimpleDateFormat("yyMMddHHmmss").format(new Date());

        // 2位随机数：10~99（避免同一秒内多次点击撞号）
        int rnd = ThreadLocalRandom.current().nextInt(10, 100);

        return p + time + rnd;
    }

    /**
     * 需要更短的版本（可选）
     * 格式：PREFIX + yyMMdd + 4位随机数
     * 示例：CK2401134837
     *
     * 注意：比带秒的版本更短，但理论碰撞概率略高（一般够用）
     */
    public static synchronized String generateShortBillNo(String prefix) {
        final String p = (prefix == null || prefix.trim().isEmpty())
                ? DEFAULT_PREFIX
                : prefix.trim().toUpperCase();

        String day = new SimpleDateFormat("yyMMdd").format(new Date());
        int rnd4 = ThreadLocalRandom.current().nextInt(1000, 10000);

        return p + day + rnd4;
    }
}
