package com.ruoyi.project.project.util;
import java.util.regex.Pattern;

/**
 * ClassName: ValidatorUtils
 * Package: com.ruoyi.project.project.util
 * Description:
 *
 * @Author zhaodw
 * @Create 2025/7/11 17:08
 * @Version 1.0
 */
public class ValidatorUtils {
    // 手机号正则（中国大陆）
    private static final Pattern PHONE_PATTERN = Pattern.compile(
            "^1[3-9]\\d{9}$"
    );

    // 18位身份证号正则（包含校验码验证）
    private static final Pattern ID_CARD_PATTERN = Pattern.compile(
            "^[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[0-9Xx]$"
    );

    // 身份证号校验码权重因子
    private static final int[] WEIGHTS = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};

    // 身份证号校验码对应表
    private static final char[] CHECK_CODES = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};

    /**
     * 校验手机号格式
     * @param phone 手机号
     * @return 是否有效
     */
    public static boolean isValidPhone(String phone) {
        if (phone == null || phone.isEmpty()) {
            return false;
        }
        return PHONE_PATTERN.matcher(phone).matches();
    }

    /**
     * 校验身份证号格式（包含校验码验证）
     * @param idCard 身份证号
     * @return 是否有效
     */
    public static boolean isValidIdCard(String idCard) {
        if (idCard == null || idCard.isEmpty()) {
            return false;
        }

        // 长度校验
        if (idCard.length() != 18) {
            return false;
        }

        // 格式校验
        if (!ID_CARD_PATTERN.matcher(idCard).matches()) {
            return false;
        }

        // 校验码验证
        char[] chars = idCard.toUpperCase().toCharArray();
        int sum = 0;
        for (int i = 0; i < 17; i++) {
            sum += (chars[i] - '0') * WEIGHTS[i];
        }
        int mod = sum % 11;
        return chars[17] == CHECK_CODES[mod];
    }

}