package com.nis.util;

import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.regex.Pattern;

public class BasicProvingUtil {
	public static void main(String[] args) {
		// String ip = "::";
		String ip = " fe80::d025:864c:3151:daa0";
		System.out.println(ip + "=" + isIpv6(ip));

	}

	/**
	 * 判断是否是Integer类型
	 * 
	 * @param obj
	 * @return
	 */
	public static boolean isIntType(Object obj) {
		if (obj == null) {
			return false;
		}
		String num = obj.toString().trim();
		if (num.length() == 0) {
			return false;
		}
		try {
			Integer.parseInt(num);
			return true;
		} catch (Exception e) {
			return false;
		}
	}

	/**
	 * 判断是否是Long类型
	 * 
	 * @param obj
	 * @return
	 */
	public static boolean isLongType(Object obj) {
		if (obj == null) {
			return false;
		}
		String num = obj.toString().trim();
		if (num.length() == 0) {
			return false;
		}
		try {
			Long.parseLong(num);
			return true;
		} catch (Exception e) {
			return false;
		}
	}

	/**
	 * 判断是否是Double类型
	 * 
	 * @param obj
	 * @return
	 */
	public static boolean isDoubleType(Object obj) {
		if (obj == null) {
			return false;
		}
		String num = obj.toString().trim();
		if (num.length() == 0) {
			return false;
		}
		try {
			Double.parseDouble(num);
			return true;
		} catch (Exception e) {
			return false;
		}
	}

	/**
	 * 判断ip或ip掩码格式是否正确(ipv4或ipv6) true代表格式正确 false代表格式不正确
	 * 
	 * @param ip
	 * @param ipType
	 *            ipv4还是ipv6(4,6)
	 * @return
	 */
	public static boolean isIpOrIpMask(String ip, Integer ipType) {
		// boolean ipv4Bool = val_ipv4(ip);
		// boolean ipv6Bool = val_ipv6(ip);
		// if (ipv6Bool) {

		if (null != ip && !ip.equals("")) {
			if (null != ipType && ipType == 4) {
				boolean ipv4 = isIpv4(ip.trim());
				if (ipv4) {
					return true;
				}
			} else if (null != ipType && ipType == 6) {
				boolean ipv6 = isIpv6(ip.trim());
				if (ipv6) {
					return true;
				}

			} else {// ipType不等于4或6时不验证与ipType是否一致,仅验证是否是ip格式
				boolean ipv6 = isIpv6(ip.trim());
				boolean ipv4 = isIpv4(ip.trim());
				if (ipv6 || ipv4) {
					return true;
				} else {
					return false;
				}
			}
		}
		return false;
	}

	/**
	 * 判断端口或端口掩码格式是否正确(0-65535) true代表格式正确 false代表格式不正确
	 * 
	 * @param ip
	 * @return
	 */
	public static boolean isPortOrPortMask(String port) {
		try {
			if (null != port && !port.equals("")) {
				int parseInt = Integer.parseInt(port.trim());
				if (parseInt >= 0 && parseInt <= 65535) {
					return true;
				} else {
					return false;
				}
			} else {
				return false;
			}

		} catch (Exception e) {
			return false;
		}
	}

	public static boolean isIpv4(String ipAddress) {
		try {
			String ipv4 = "^(0|1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\."
					+ "(0|1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\." + "(0|1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
					+ "(0|1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$";
			return Pattern.compile(ipv4).matcher(ipAddress).matches();
		} catch (Exception e) {
			return false;
		}
	}

	public static boolean isIpv6(String ipAddress) {
		try {

			String ipv6 = "^((::)|(([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:)|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}(:[0-9A-Fa-f]{1,4}){1,2})|(([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4}){1,3})|(([0-9A-Fa-f]{1,4}:){3}(:[0-9A-Fa-f]{1,4}){1,4})|(([0-9A-Fa-f]{1,4}:){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})|(([0-9A-Fa-f]{1,4}:){6}(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3})|(([0-9A-Fa-f]{1,4}:){5}:(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3})|(([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4}){0,1}:(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3})|(([0-9A-Fa-f]{1,4}:){3}(:[0-9A-Fa-f]{1,4}){0,2}:(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3})|(([0-9A-Fa-f]{1,4}:){2}(:[0-9A-Fa-f]{1,4}){0,3}:(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3})|([0-9A-Fa-f]{1,4}:(:[0-9A-Fa-f]{1,4}){0,4}:(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3})|(:(:[0-9A-Fa-f]{1,4}){0,5}:(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3}))$";
			return Pattern.compile(ipv6).matcher(ipAddress).matches();
		} catch (Exception e) {
			return false;
		}
	}

	public static boolean val_ipv4(String host) {
		InetAddress addressIpv4 = null;

		try {
			addressIpv4 = InetAddress.getByName(host);
		} catch (UnknownHostException e) {
			return false;
		}
		if (addressIpv4 instanceof Inet6Address) {
			return false;
		}
		if (addressIpv4 instanceof Inet4Address) {
			return true;
		}
		return false;
	}

	public static boolean val_ipv6(String host) {
		InetAddress addressIpv6 = null;
		try {
			addressIpv6 = InetAddress.getByName(host);
		} catch (UnknownHostException e) {
			e.printStackTrace();
			return false;
		}
		if (addressIpv6 instanceof Inet6Address) {
			return true;
		}
		if (addressIpv6 instanceof Inet4Address) {
			return false;
		}
		return false;
	}
}
