/**    
* @Title: PhoneUtils.java  
* @Package com.thinkgem.jeesite.common.utils  
* @Description: TODO(用一句话描述该文件做什么)  
* @author zhanghao    
* @date 2019年3月8日 下午4:33:14  
* @version V1.0    
*/
package com.huatek.frame.base.util;

import cn.hutool.core.util.StrUtil;

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

/**  
* @ClassName: PhoneUtils  
* @Description: TODO(验证手机号码)  
* @author zhanghao  
* @date 2019年3月8日 下午4:33:14  
*    
*/
public class PhoneUtils {
	
	/**
     * 中国手机号码
     */
    private static Pattern CHINESE_PHONE_PATTERN = Pattern.compile("((13|15|17|18)\\d{9})|(14[57]\\d{8})");
    
    /**
     * 正则表达式:验证邮箱
     */
    public static final String REGEX_EMAIL = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";

    /**
     * 固定电话，带区号（格式：区号-固定电话）
     */
    private final static String REGEX_FIXEDPHONE = "^[0][1-9]{2,3}-[0-9]{5,10}$";
    
    
    /**
     * 校验邮箱
     * 
     * @param email
     * @return 校验通过返回true，否则返回false
     */
    public static boolean isEmail(String email) {
        return Pattern.matches(REGEX_EMAIL, email);
    }
    
    /**
	 * 区号+座机号码+分机号码
	 * @param fixedPhone
	 * @return
	 */
	public static boolean isFixedPhone(String fixedPhone){
		String reg="(?:(\\(\\+?86\\))(0[0-9]{2,3}\\-?)?([2-9][0-9]{6,7})+(\\-[0-9]{1,4})?)|" +
				"(?:(86-?)?(0[0-9]{2,3}\\-?)?([2-9][0-9]{6,7})+(\\-[0-9]{1,4})?)";
		return Pattern.matches(reg, fixedPhone);
	}

    /**
     * 区号+座机号码
     * @param fixedPhone
     * @return
     */
    public static boolean isFixedTel(String fixedPhone){
        return Pattern.matches(REGEX_FIXEDPHONE, fixedPhone);
    }
	
	/** 
     * 匹配中国邮政编码 
     * @param postCode 邮政编码
     * @return 验证成功返回true，验证失败返回false 
     */ 
	public static boolean isPostCode(String postCode){
		String reg = "[1-9]\\d{5}";
		return Pattern.matches(reg, postCode);
	}
    
    /**
     * 是否是有效的中国手机号码
     * @param phone
     * @return
     */
    public static boolean isValidChinesePhone(String phone) {
        if (phone == null || phone.length() != 11) {
            return false;
        }
        
        Matcher matcher = CHINESE_PHONE_PATTERN.matcher(phone);
        return matcher.matches();
    }
    
    /**
     * 大陆号码或香港号码均可
     */
    public static boolean isPhoneLegal(String str) throws PatternSyntaxException {
        return isChinaPhoneLegal(str) || isHKPhoneLegal(str);
    }

    /**
     * 大陆手机号码11位数，匹配格式：前三位固定格式+后8位任意数 此方法中前三位格式有： 13+任意数 15+除4的任意数 18+除1和4的任意数
     * 17+除9的任意数 147
     */
    public static boolean isChinaPhoneLegal(String str) throws PatternSyntaxException {
        String regExp = "^((13[0-9])|(15[^4])|(18[0,2,3,5-9])|(17[0-8])|(147))\\d{8}$";
        Pattern p = Pattern.compile(regExp);
        Matcher m = p.matcher(str);
        return m.matches();
    }

    /**
     * 香港手机号码8位数，5|6|8|9开头+7位任意数
     */
    public static boolean isHKPhoneLegal(String str) throws PatternSyntaxException {
        String regExp = "^(5|6|8|9)\\d{7}$";
        Pattern p = Pattern.compile(regExp);
        Matcher m = p.matcher(str);
        return m.matches();
    }
    
    /**
     * 检查手机是否无效
     * @param phone
     * @return
     */
    public static boolean isNotValidChinesePhone(String phone) {
        return !isValidChinesePhone(phone);
    }
    
    /**
     * 手机中间添加星号
     * @param phone
     * @param beginIndex
     * @param endIndex
     * @return empty string if phone length is illegal
     */
    public static String setAsterisk(String phone, int beginIndex, int endIndex) {
        
        if (StrUtil.isBlank(phone)) {
            return StrUtil.EMPTY;
        }
        
        if (beginIndex < 0 || endIndex < 0 || beginIndex > phone.length() || endIndex > phone.length()) {
            throw new IllegalArgumentException("illegal index " + beginIndex + "," + endIndex);
        }
        
        StringBuilder phoneWithAsterisk = new StringBuilder(phone.substring(0, beginIndex));  
        
        for (int i = beginIndex; i < endIndex; i++) {  
            phoneWithAsterisk.append("*");  
        }  
        
        phoneWithAsterisk.append(phone.substring(endIndex, phone.length()));
        return phoneWithAsterisk.toString();
    }
    
    /**
     * 手机中间添加星号
     * @param phone
     * @return
     */
    public static String setAsterisk(String phone) {
        return setAsterisk(phone, 3, 7);
    }

    /**
     * 手机中间添加星号,中间六位
     * @param phone
     * @return
     */
    public static String setAsterisk2(String phone) {
        return setAsterisk(phone, 3, 9);
    }

}
