package org.xyzh.common.utils.validation.method;

/**
 * @description 银行卡号校验方法（Luhn算法）
 * @filename BankCardValidateMethod.java
 * @author yslg
 * @copyright xyzh
 * @since 2025-10-16
 */
public class BankCardValidateMethod implements ValidateMethod {
    
    @Override
    public boolean validate(Object value) {
        if (value == null || !(value instanceof String)) {
            return false;
        }
        
        String cardNumber = ((String) value).replaceAll("\\s", "");
        
        // 长度校验（银行卡号通常为16-19位）
        if (cardNumber.length() < 16 || cardNumber.length() > 19) {
            return false;
        }
        
        // 数字校验
        if (!cardNumber.matches("^\\d+$")) {
            return false;
        }
        
        // Luhn算法校验
        return luhnCheck(cardNumber);
    }
    
    /**
     * @description Luhn算法校验（银行卡校验算法）
     * @param cardNumber 银行卡号
     * @return boolean 是否通过校验
     */
    private boolean luhnCheck(String cardNumber) {
        int sum = 0;
        boolean alternate = false;
        
        // 从右向左遍历
        for (int i = cardNumber.length() - 1; i >= 0; i--) {
            int digit = Character.getNumericValue(cardNumber.charAt(i));
            
            if (alternate) {
                digit *= 2;
                if (digit > 9) {
                    digit = digit - 9;
                }
            }
            
            sum += digit;
            alternate = !alternate;
        }
        
        return sum % 10 == 0;
    }
    
    @Override
    public String getErrorMessage() {
        return "请输入有效的银行卡号";
    }
    
    @Override
    public String getName() {
        return "银行卡号校验";
    }
}

