package com.sw.common.accessory.utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 籽晶编号生成器
 *
 * @Author：wanjia
 * @Date：2024/1/9 14:38
 */
public class CodeGenerator {

    private static final String[] CHARACTER = {"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 String REDIS_KEY = "ssh_no";


    /**
     * 构建日期
     *
     * @return
     */
    public static String buildDay() {
        Calendar calendar = Calendar.getInstance();
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        if (day <= 9) {
            return "0" + day;
        }
        return java.lang.String.valueOf(day);
    }

    /**
     * 构建月
     * 规则：
     * 1、1-9月返回数字
     * 2、10月A 11月B 12月C
     *
     * @return
     */
    public static String buildMonth() {
        Calendar calendar = Calendar.getInstance();
        int month = calendar.get(Calendar.MONTH) + 1;//jdk里面取到的值会-1，所以外面需要加1
        if (month <= 9) {
            return java.lang.String.valueOf(month);
        }
        if (month == 10) {
            return "A";
        } else if (month == 11) {
            return "B";
        } else if (month == 12) {
            return "C";
        }
        return "";
    }

    /**
     * 构建年的值
     * <p>
     * 规则：2023年取3，到2029年位置取9
     * 2030年开始用A,之后用字母循环使用
     *
     * @return
     */
    public static String buildYear() {
        SimpleDateFormat format = new SimpleDateFormat("yyyy");
        String yyyy = format.format(new Date());
        int year = Integer.parseInt(yyyy);
        //如果时间小于2029年，则取尾数
        if (year <= 2029) {
            return yyyy.substring(3);
        }
        int mod = year - 2030;
        if (mod < 26) { //如果第一轮内
            return CHARACTER[mod];
        } else {
            return CHARACTER[mod % 26];
        }
    }

    /**
     * 流水号，001-999 按天维度滚动
     * <p>
     * 实现逻辑，通过redis做一个锁，key为年月日，value为流水号
     * 跟产品确认过
     *
     * @return
     */
    public String buildBatchNo() {
        long value = RedisUtils.incrAtomicValue(REDIS_KEY);
        if (value < 10) {
            return '0'+String.valueOf(value);
        }else if(value >= 10 && value < 100){
            return String.valueOf(value);
         }else {
            RedisUtils.setAtomicValue(REDIS_KEY,1);
        }
        return String.valueOf(value);
    }
}
