package org.dromara.zhishu.util;

import org.dromara.common.core.utils.StringUtils;

import java.util.HashMap;
import java.util.Map;

/**
 * 货号工具类
 */
public class ArtNoUtil {

    public Map<String, String> parseArtNo(String artNo) {
        /**
         * 从货号前五位解析 一级  二级  三级 货区编码
         */
        Map<String, String> result = new HashMap<>();

        if (artNo == null || artNo.length() < 5) {
            throw new IllegalArgumentException("货号长度不能少于5位");
        }

        String depotFive = artNo.substring(0, 5);

        // 1.字符串前两位是一级货区
        String depotLevel = depotFive.substring(0, 2);
        result.put("depotLevel", depotLevel);

        // 2.字符串第三位如果是数字 则二级货区1位 ，字符串如果是字母 则 二级货区2位
        String shelvesLevel;
        String freightLevel;

        char freightChar = depotFive.charAt(2);
        if (Character.isDigit(freightChar)) {
            // 二级货区1位
            shelvesLevel = String.valueOf(freightChar);
            // 3.如果二级货区编码只有一位 则三级货区是两位
            freightLevel = depotFive.substring(3, 5);
        } else {
            // 二级货区2位
            shelvesLevel = depotFive.substring(2, 4);
            // 3.如果二级货区两位 则三级货区一位
            freightLevel = depotFive.substring(4, 5);
        }

        result.put("shelvesLevel", shelvesLevel);
        result.put("freightLevel", freightLevel);

        return result;
    }

    /**
     * 校验货号是否符合规则
     * @param artNo 货号
     * @return 是否符合规则
     */
    public static boolean validateArtNo(String artNo) {
        // 长度校验
        if ( StringUtils.isEmpty(artNo) || artNo.length() < 19) {
            return false;
        }

        String depotFive = artNo.substring(0, 5);

        // 校验前两位（一级货区）
        String depotLevel = depotFive.substring(0, 2);
        // 这里可以根据实际需求添加对一级货区的具体校验

        char thirdChar = depotFive.charAt(2);

        // 第一种情况：第三位是数字
        if (Character.isDigit(thirdChar)) {
            // 二级货区1位（第三位），三级货区2位（第四、五位）
            String freightLevel = depotFive.substring(3, 5);

            // 校验三级货区格式：纯数字 或者 第四位是字母+第五位是数字
            char fourthChar = freightLevel.charAt(0);
            char fifthChar = freightLevel.charAt(1);

            // 情况1：纯数字
            boolean isAllDigits = Character.isDigit(fourthChar) && Character.isDigit(fifthChar);

            // 情况2：第四位是字母 + 第五位是数字
            boolean isLetterAndDigit = Character.isLetter(fourthChar) && Character.isDigit(fifthChar);

            return isAllDigits || isLetterAndDigit;
        }
        // 第二种情况：第三位是字母
        else if (Character.isLetter(thirdChar)) {
            // 二级货区2位（第三、四位），三级货区1位（第五位）
            // 第四位不需要管，直接校验第五位是否是数字
            char fifthChar = depotFive.charAt(4);
            return Character.isDigit(fifthChar);
        }

        // 如果第三位既不是数字也不是字母，返回false
        return false;
    }
}