package com.bohuikeji.frame.module.admin.utils;

import com.baomidou.mybatisplus.extension.toolkit.SqlRunner;
import com.bohuikeji.frame.module.admin.entity.sys.SysRes;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomStringUtils;

import java.time.LocalDate;

/**
 * 编号生成器
 * @author 10552
 */
@Slf4j
public class NumberUtils {

    /**
     * 当日自增位
     */
    private static Integer addNum=0;
    /**
     * 运行日期(初始日期)
     */
    private static LocalDate runDate=LocalDate.now();

    /**
     * 获取唯一编号
     * @param pix 前缀
     * @return
     */
    public static String get(String pix){
        return pix+get();
    }

    /**
     * 获取唯一编号
     * @return
     */
    public static String get(){
        return getDbNum()+getDateNum()+getAddNum()+getRandom(1);
    }

    /**
     * 获取短编号（不含日期编码）
     * @return
     */
    public static String getShort(){
        return  getDbNum()+getAddNum()+getRandom(3);
    }

    /**
     * 生成随机密码
     * @return
     */
    public static String getPwd(){
        return  RandomStringUtils.randomAlphanumeric(8);
    }
    /**
     * 生成随机密码
     * @return
     */
    public static String getPwd(int size){
        return  RandomStringUtils.randomAlphanumeric(size);
    }

    /**
     * 内部类
     * 只实例化一次
     */
    private static class NumHolder{
        /**
         * 数据库标识位
         * 项目每启动一次加一
         */
        private static  String dbNum;
        static {
            SqlRunner sqlRunner=new SysRes().sql();
            dbNum=sqlRunner.selectObj("select auto_value from sys_auto_num where auto_key='number_utils'").toString();
            //自增
            sqlRunner.update("update sys_auto_num set auto_value=auto_value+1 where auto_key='number_utils'");
        }
    }

    /**
     * 获取启动标志位
     * @return
     */
    private static String getDbNum(){
        return NumHolder.dbNum;
    }

    /**
     * 获取日自增位
     * @return
     */
    private static Integer getAddNum(){
        return addNum+=1;
    }

    /**
     * 获取日期
     * @return
     */
    private static String getDateNum(){
        LocalDate now=LocalDate.now();
        //当前日期与项目运行日期不为同一天则重置日自增位
        if(runDate.getDayOfMonth()!=now.getDayOfMonth()){
            addNum=0;
            runDate=now;
        }
        return runDate.getYear()+""+runDate.getMonthValue()+""+runDate.getDayOfMonth();
    }

    /**
     * 获取指定位数的随机位
     * @param length
     * @return
     */
    public static String getRandom(int length){
        return  (int)((Math.random()*9+1)*Math.pow(10,length-1))+"";
    }

    public static String getRequestNo(){
        LocalDate now=LocalDate.now();
        //当前日期与项目运行日期不为同一天则重置日自增位
        if(runDate.getDayOfMonth()!=now.getDayOfMonth()){
            addNum=0;
            runDate=now;
        }
        return  "1555319231"+runDate.getYear()+""+runDate.getMonthValue()+""+runDate.getDayOfMonth()+getDbNum()+getAddNum()+getRandom(4);
    }

}
