package com.yonge.toolset.utils.validator;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang3.StringUtils;

/**
 * 常用验证类，如邮箱，手机格式验证
 *
 * @author pengdc
 */
public class CommonValidator {

    private final static String MOBILE_NO = "^((13[0-9])|(14[5|7|9])|(15[^4,\\D])|(166)|(18[0-9])|(17[0|1|3|5|6|7|8])|(19[8|9]))\\d{8}$";

    private static final String TELEPHONE_NO = "((\\d{10})|(\\d{11})|^((\\d{7,8})|(\\d{4}|\\d{3})-(\\d{7,8})|(\\d{4}|\\d{3})-(\\d{7,8})-(\\d{4}|\\d{3}"
            + "|\\d{2}|\\d{1})|(\\d{7,8})-(\\d{4}|\\d{3}|\\d{2}|\\d{1}))$)";

    private static final String EMAIL_ADDR = "^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";

    private static final String PWD_CHECK_REGEX = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,16}$";

    private static Pattern mobileNoPattern = Pattern.compile(MOBILE_NO);
    private static Pattern telephoneNoPattern = Pattern.compile(TELEPHONE_NO);
    private static Pattern emailAddrPattern = Pattern.compile(EMAIL_ADDR);
    private static Pattern pwdCheckPattern = Pattern.compile(PWD_CHECK_REGEX);

    /**
     * 是否邮箱地址
     *
     * @param emailAddr
     * @return
     */
    public static boolean isEmailAddr(String emailAddr) {
        if (StringUtils.isBlank(emailAddr)) {
            return false;
        }
        Matcher matcher = emailAddrPattern.matcher(emailAddr);
        return matcher.matches();
    }

    /**
     * 是否手机
     *
     * @param mobileNo
     * @return boolean
     */
    public static boolean isMobileNo(String mobileNo) {
        if (StringUtils.isBlank(mobileNo)) {
            return false;
        }
        Matcher matcher = mobileNoPattern.matcher(mobileNo);
        return matcher.matches();
    }

    /**
     * 是否座机
     *
     * @param telephoneNo
     * @return boolean
     */
    public static boolean isTelephoneNo(String telephoneNo) {
        if (StringUtils.isBlank(telephoneNo)) {
            return false;
        }
        Matcher matcher = telephoneNoPattern.matcher(telephoneNo);
        return matcher.matches();
    }

    /**
     * 是否是座机或手机号码
     *
     * @param teleOrMobileNo
     * @return boolean
     */
    public static boolean isTelephoneOrMobileNo(String teleOrMobileNo) {
        if (StringUtils.isBlank(teleOrMobileNo)) {
            return false;
        }
        Matcher matcher1 = telephoneNoPattern.matcher(teleOrMobileNo);
        if (matcher1.matches()) {
            return true;
        }
        Matcher matcher2 = mobileNoPattern.matcher(teleOrMobileNo);
        return matcher2.matches();
    }

    /**
     * 是否至少包含数字、字母，长度在6-16位的字符串
     *
     * @param password
     * @return boolean
     */
    public static boolean isComplexityOfPwd(String password) {
        if (StringUtils.isBlank(password)) {
            return false;
        }
        Matcher matcher = pwdCheckPattern.matcher(password);
        return matcher.matches();
    }


    /**
     * 校验银行卡号方法
     *
     * @param bankCard
     * @return
     */
    public static boolean isBankCard(String bankCard) {
        if (bankCard.length() < 15 || bankCard.length() > 19) {
            return false;
        }
        char bit = getBankCardCheckCode(bankCard.substring(0, bankCard.length() - 1));
        if (bit == 'N') {
            return false;
        }
        return bankCard.charAt(bankCard.length() - 1) == bit;
    }

    /**
     * 从不含校验位的银行卡卡号采用 Luhm 校验算法获得校验位
     *
     * @param nonCheckCodeBankCard
     * @return
     */
    public static char getBankCardCheckCode(String nonCheckCodeBankCard) {
        if (nonCheckCodeBankCard == null || nonCheckCodeBankCard.trim().length() == 0
                || !nonCheckCodeBankCard.matches("\\d+")) {
            //如果传的不是数据返回N
            return 'N';
        }
        char[] chs = nonCheckCodeBankCard.trim().toCharArray();
        int luhmSum = 0;
        for (int i = chs.length - 1, j = 0; i >= 0; i--, j++) {
            int k = chs[i] - '0';
            if (j % 2 == 0) {
                k *= 2;
                k = k / 10 + k % 10;
            }
            luhmSum += k;
        }
        return (luhmSum % 10 == 0) ? '0' : (char) ((10 - luhmSum % 10) + '0');
    }

	public static void main(String[] args) {

	}

}
