package cn.timer.api.config.enums;

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

import lombok.Getter;

/**
 * @date 2020年4月15日  
 * @author 翁东州
 * @scene 使用场景:字符串的正则验证
 */
@Getter
public enum Regular {
	/**
	 * 不超过20字符
	 */
	CHARS20("CHARS20","(\\s|\\S){0,20}"),
	/**
	 * 不超过500字符
	 */
	CHARS500("CHARS500","(\\s|\\S){0,500}"),
	/**
	 * 手机号码
	 */
	PHONE("PHONE","^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(17[013678])|(18[0,5-9]))\\d{8}$"),
	/**
	 * 身份证
	 */
	IDCARD("IDCARD","(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)"),
	/**
	 * 账号是否合法
	 */
	TOFZHANHAO("TOFZHANHAO","^[a-zA-Z][a-zA-Z0-9_]{4,15}$"),
	/**
	 * 密码是否合法
	 */
	TOFPW("TOFPW","^[a-zA-Z]\\w{5,17}$"),
	/**
	 * 强密码
	 */
	SHPW("SHPW","^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,10}$"),
	/**
	 * 纯汉字输入
	 */
	CHINESE("CHINESE","[\\u4E00-\\u9FA5]*"),
	/**
	 * 邮箱
	 */
	EMAIL("EMAIL","^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$"),
	/**
	 * 域名
	 */
	DNS("DNS","[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\\.?"),
	/**
	 * 非负整数
	 */
	FUNUM("FUNUM","^(0|[1-9][0-9]*)$"),
	/**
	 * xml文件命名
	 */
	XML("XML","^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.(xml|XML|Xml)$"),
	/**
	 * QQ
	 */
	QQ("QQ","[1-9][0-9]{4,}"),
	/**
	 * 邮政
	 */
	YOUZHEN("YOUZHEN","[1-9]\\d{5}(?!\\d)"),
	/**
	 * IP
	 */
	IPADDRESS("IPADDRESS","\\d+\\.\\d+\\.\\d+\\.\\d+"),
	/**
	 * IP255.255.255.255
	 */
	IP255("IP255","((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))"),
	/**
	 * IP-V4
	 */
	IPV4("IPV4","\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b"),
	/**
	 * IP-V6
	 */
	IPV6("IPV6","(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))"),
	/**
	 * 子网掩码
	 */
	SUBM("SUBM","((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))"),
	/**
	 * yyyy-mm-dd 平闰年校验
	 */
	YMD("YMD","^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$"),
	/**
	 * 身份证校验码看isIdCard
	 */
	IDSTRING("IDSTRING","(^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}$)");
	
	private String name;
	private String regex;
	
	Regular(String name,String regex) {
		this.name = name;
		this.regex = regex;
	}
	
	/**
	 * @return true/false
	 * @input 需要验证的字符串
	 * @regular 需要验证的枚举类型
	 */
	public static boolean match(String input,Regular regular) {
		String regex = regular.getRegex();
		Pattern p = Pattern.compile(regex);
	    Matcher m = p.matcher(input);
	    boolean tof = m.matches();
	    return tof;
	}

	
}