package psdi.app.iface.comm;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * 三位数自动递增生成编号 数字 字母 组合
 */
public class generateSerialCode {
    /**
     * @param len
     * @param i
     * @param driver 上一个三位数
     */
    public synchronized static String GetSerialCode(int len, Integer i, String driver) {
        String dr = "";
        AtomicInteger z = new AtomicInteger(i);
        z.getAndIncrement();
        if (z.toString().length() > (len - (driver != null ? driver.length() : 0))) {
            dr = driverCheck(driver, len);
            //如超出限定长度并字母都为Z的时候，限定长度加1，dr重新开始，默认为空
            if (dr.equals(".N")) {
                len++;
                System.out.println("超出范围");
                dr = "";
            } else {
                z.set(1);
            }
        } else {
            dr = driver;
        }
        if (dr.length() == len) {
            System.out.println(dr);
        } else {
            System.out.println(String.format("%0" + (len - dr.length()) + "d", z.intValue()) + dr);
        }
        return dr;
    }

    /**
     * 字母有效检查
     * <p>
     * 1.检查字母是否都为Z
     * <p>
     * 2.检查字母长度
     *
     * @param driver
     * @param len
     * @return
     */

    public static String driverCheck(String driver, int len) {
        char[] charArray = driver.toCharArray();
        AtomicInteger z = new AtomicInteger(0);
        for (char c : charArray) {
            if (c == 'Z') {
                z.getAndIncrement();
            }
        }
        if (z.intValue() == driver.length() && z.intValue() == len) {
            ///如所有字母都为Z，并且长度达到限定长度，返回.N
            return ".N";
        } else if (z.intValue() == driver.length() && z.intValue() < len) {
            return driver("@" + driver);
        } else {//以上两个条件都不满足，则直接递增
            return driver(driver);
        }
    }
    /**
     * 字母递增
     *
     * @param driver
     * @return
     */
    public static String driver(String driver) {
        if (driver != null && driver.length() > 0) {
            char[] charArray = driver.toCharArray();
            AtomicInteger z = new AtomicInteger(0);
            for (int i = charArray.length - 1; i > -1; i--) {
                if (charArray[i] == 'Z') {
                    z.set(z.incrementAndGet());
                } else {
                    if (z.intValue() > 0 || i == charArray.length - 1) {
                        AtomicInteger atomic = new AtomicInteger(charArray[i]);
                        if (charArray[i] == '9' && charArray[i - 1] == '9' && charArray[i - 2] == '9') {
                            charArray[i] = '0';
                            charArray[i - 1] = '0';
                            charArray[i - 2] = (char) atomic.addAndGet(8);
                        } else if (charArray[i] > charArray[i - 1] && charArray[i] == '9') {
                            charArray[i] = '0';
                            charArray[i - 1] = ++charArray[i - 1];
                        } else if (charArray[i] == '9' && charArray[i - 1] == '9' && charArray[i - 2] != 'Z') {
                            charArray[i] = '0';
                            charArray[i - 1] = '0';
                            if (charArray[i - 2] == 'Z') {
                                charArray[i - 1] = (char) atomic.addAndGet(8);
                            }
                            int ascll = (int) charArray[i - 2];
                            ascll = ascll + 1;
                            charArray[i - 2] = (char) ascll;
                            z.set(0);
                        } else if (charArray[i] == '9' && charArray[i - 1] == '9' && charArray[i - 2] == 'Z') {
                            charArray[i] = '0';
                            charArray[i - 1] = (char) atomic.addAndGet(8);
                        } else if (charArray[i] == '9' && charArray[i - 1] == 'Z' && charArray[i - 2] == 'Z') {
                            charArray[i] = (char) atomic.addAndGet(8);
                        } else if (charArray[i] == '9') {
                            charArray[i] = '0';
                            int ascll = (int) charArray[i - 1];
                            ascll = ascll + 1;
                            charArray[i - 1] = (char) ascll;
                            z.set(0);
                        } else {
                            charArray[i] = (char) atomic.incrementAndGet();
                            z.set(0);
                        }
                    }
                }
            }
            return String.valueOf(charArray);
        } else {
            return "A";
        }
    }

    public static void main(String[] args) {
        String code = GetSerialCode(3, 999, "065");
        System.out.println("code="+code);
    }


}
