package cn.timer.api.utils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.UnknownHostException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.http.HttpServletRequest;

import cn.hutool.core.util.StrUtil;
import nl.bitwalker.useragentutils.Browser;
import nl.bitwalker.useragentutils.OperatingSystem;
import nl.bitwalker.useragentutils.UserAgent;

public class UserIp {

	/** 
     * 获取当前网络ip 
     * @param request 
     * @return 
     */  
    public static String getIpAddr(HttpServletRequest request){  
        String ipAddress = request.getHeader("x-forwarded-for");  
            if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {  
                ipAddress = request.getHeader("Proxy-Client-IP");  
            }  
            if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {  
                ipAddress = request.getHeader("WL-Proxy-Client-IP");  
            }  
            if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {  
                ipAddress = request.getRemoteAddr();  
                if(ipAddress.equals("127.0.0.1") || ipAddress.equals("0:0:0:0:0:0:0:1")){  
                    //根据网卡取本机配置的IP  
                    InetAddress inet=null;  
                    try {  
                        inet = InetAddress.getLocalHost();  
                    } catch (UnknownHostException e) {  
                        e.printStackTrace();  
                    }  
                    ipAddress= inet.getHostAddress();  
                }  
            }  
            //对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割  
            if(ipAddress!=null && ipAddress.length()>15){ //"***.***.***.***".length() = 15  
                if(ipAddress.indexOf(",")>0){  
                    ipAddress = ipAddress.substring(0,ipAddress.indexOf(","));  
                }  
            }  
            return ipAddress;   
    }
	
	public static String getClientOS(String userAgent)
    {
        String cos = "unknow os";
        
        Pattern p = Pattern.compile(".*(Windows NT 6\\.1).*");
        Matcher m = p.matcher(userAgent);
        if(m.find())
        {
            cos = "Win 7";
            return cos;
        }
        
        p = Pattern.compile(".*(Windows NT 5\\.1|Windows XP).*");
        m = p.matcher(userAgent);
        if(m.find())
        {
            cos = "WinXP";
            return cos;
        }
        
        p = Pattern.compile(".*(Windows NT 5\\.2).*");
        m = p.matcher(userAgent);
        if(m.find())
        {
            cos = "Win2003";
            return cos;
        }
        
        p = Pattern.compile(".*(Win2000|Windows 2000|Windows NT 5\\.0).*");
        m = p.matcher(userAgent);
        if(m.find())
        {
            cos = "Win2000";
            return cos;
        }
        
        p = Pattern.compile(".*(Mac|apple|MacOS8).*");
        m = p.matcher(userAgent);
        if(m.find())
        {
            cos = "MAC";
            return cos;
        }
        
        p = Pattern.compile(".*(WinNT|Windows NT).*");
        m = p.matcher(userAgent);
        if(m.find())
        {
            cos = "WinNT";
            return cos;
        }
        
        p = Pattern.compile(".*Linux.*");
        m = p.matcher(userAgent);
        if(m.find())
        {
            cos = "Linux";
            return cos;
        }
        
        p = Pattern.compile(".*(68k|68000).*");
        m = p.matcher(userAgent);
        if(m.find())
        {
            cos = "Mac68k";
            return cos;
        }
        
        p = Pattern.compile(".*(9x 4.90|Win9(5|8)|Windows 9(5|8)|95/NT|Win32|32bit).*");
        m = p.matcher(userAgent);
        if(m.find())
        {
            cos = "Win9x";
            return cos;
        }
        
        return cos;
    }
	
	
	  /**
	 2      * 获取服务器IP地址
	 3      * @return
	 4      */
	 public static String getlocahostIp() {
		 InetAddress addr;
			try {
				addr = InetAddress.getLocalHost();
				String hostAddress = addr.getHostAddress();//获得本机IP
				return 	hostAddress;

			} catch (UnknownHostException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return null;
	 }
	 
	 public static String[] getclientMsg(HttpServletRequest request) throws Exception {  
		 String[] strings = new String[3];
		 UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent"));  
		 Browser browser = userAgent.getBrowser();
		 System.out.println("浏览器    "+browser);
		 OperatingSystem os = userAgent.getOperatingSystem();
		 System.out.println("os  "+os);
		 String ip = "";
		 	try {
		 	ip = InetAddress.getLocalHost().getHostAddress(); //ip 地址
		 	} catch (UnknownHostException e) {
		 		e.printStackTrace();
		 	}
		 System.out.println("ip   "+ip);
		 strings[0] = browser.toString();
		 strings[1] = os.toString();
		 strings[2] = ip;
		 return strings;
	 } 
	 
	 public static String[] getOS(HttpServletRequest request) throws Exception {  
		 String[] strings = new String[2];
		 UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent"));  
			Browser browser = userAgent.getBrowser();
			System.out.println("浏览器    "+ browser);
			OperatingSystem os = userAgent.getOperatingSystem();
			System.out.println("os  "+os);
			String ip = "";
				ip = InetAddress.getLocalHost().getHostAddress(); //ip 地址
			System.out.println("ip   "+ip);
			strings[0] = os.toString();
			strings[1] = ip;
			return strings;
	 } 
	
	 /**
     * 将IPv4地址转换成字节
     * 
     * @param text IPv4地址
     * @return byte 字节
     */
    public static byte[] textToNumericFormatV4(String text)
    {
        if (text.length() == 0)
        {
            return null;
        }

        byte[] bytes = new byte[4];
        String[] elements = text.split("\\.", -1);
        try
        {
            long l;
            int i;
            switch (elements.length)
            {
                case 1:
                    l = Long.parseLong(elements[0]);
                    if ((l < 0L) || (l > 4294967295L))
                        return null;
                    bytes[0] = (byte) (int) (l >> 24 & 0xFF);
                    bytes[1] = (byte) (int) ((l & 0xFFFFFF) >> 16 & 0xFF);
                    bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);
                    bytes[3] = (byte) (int) (l & 0xFF);
                    break;
                case 2:
                    l = Integer.parseInt(elements[0]);
                    if ((l < 0L) || (l > 255L))
                        return null;
                    bytes[0] = (byte) (int) (l & 0xFF);
                    l = Integer.parseInt(elements[1]);
                    if ((l < 0L) || (l > 16777215L))
                        return null;
                    bytes[1] = (byte) (int) (l >> 16 & 0xFF);
                    bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);
                    bytes[3] = (byte) (int) (l & 0xFF);
                    break;
                case 3:
                    for (i = 0; i < 2; ++i)
                    {
                        l = Integer.parseInt(elements[i]);
                        if ((l < 0L) || (l > 255L))
                            return null;
                        bytes[i] = (byte) (int) (l & 0xFF);
                    }
                    l = Integer.parseInt(elements[2]);
                    if ((l < 0L) || (l > 65535L))
                        return null;
                    bytes[2] = (byte) (int) (l >> 8 & 0xFF);
                    bytes[3] = (byte) (int) (l & 0xFF);
                    break;
                case 4:
                    for (i = 0; i < 4; ++i)
                    {
                        l = Integer.parseInt(elements[i]);
                        if ((l < 0L) || (l > 255L))
                            return null;
                        bytes[i] = (byte) (int) (l & 0xFF);
                    }
                    break;
                default:
                    return null;
            }
        }
        catch (NumberFormatException e)
        {
            return null;
        }
        return bytes;
    }
	
    public static boolean internalIp(String ip)
    {
        byte[] addr = textToNumericFormatV4(ip);
        return internalIp(addr) || "127.0.0.1".equals(ip);
    }

    private static boolean internalIp(byte[] addr)
    {
        if (StrUtil.isEmptyIfStr(addr) || addr.length < 2)
        {
            return true;
        }
        final byte b0 = addr[0];
        final byte b1 = addr[1];
        // 10.x.x.x/8
        final byte SECTION_1 = 0x0A;
        // 172.16.x.x/12
        final byte SECTION_2 = (byte) 0xAC;
        final byte SECTION_3 = (byte) 0x10;
        final byte SECTION_4 = (byte) 0x1F;
        // 192.168.x.x/16
        final byte SECTION_5 = (byte) 0xC0;
        final byte SECTION_6 = (byte) 0xA8;
        switch (b0)
        {
            case SECTION_1:
                return true;
            case SECTION_2:
                if (b1 >= SECTION_3 && b1 <= SECTION_4)
                {
                    return true;
                }
            case SECTION_5:
                switch (b1)
                {
                    case SECTION_6:
                        return true;
                }
            default:
                return false;
        }
    }
	 
	 
	    
	 public static String getMACAddress(String ip) throws Exception {  
		    String line = "";  
		    String macAddress = "";  
		    final String MAC_ADDRESS_PREFIX = "MAC Address = ";  
		    final String LOOPBACK_ADDRESS = "127.0.0.1";  
		    //如果为127.0.0.1,则获取本地MAC地址。  
		    if (LOOPBACK_ADDRESS.equals(ip)) {  
		        InetAddress inetAddress = InetAddress.getLocalHost();  
		        //貌似此方法需要JDK1.6。  
		        byte[] mac = NetworkInterface.getByInetAddress(inetAddress).getHardwareAddress();  
		        //下面代码是把mac地址拼装成String  
		        StringBuilder sb = new StringBuilder();  
		        for (int i = 0; i < mac.length; i++) {  
		            if (i != 0) {  
		                sb.append("-");  
		            }  
		            //mac[i] & 0xFF 是为了把byte转化为正整数  
		            String s = Integer.toHexString(mac[i] & 0xFF);  
		            sb.append(s.length() == 1 ? 0 + s : s);  
		        }  
		        //把字符串所有小写字母改为大写成为正规的mac地址并返回  
		        macAddress = sb.toString().trim().toUpperCase();  
		        return macAddress;  
		    }  
		    //获取非本地IP的MAC地址  
		    try {  
		        Process p = Runtime.getRuntime().exec("nbtstat -A " + ip);  
		        InputStreamReader isr = new InputStreamReader(p.getInputStream());  
		        BufferedReader br = new BufferedReader(isr);  
		        while ((line = br.readLine()) != null) {  
		            if (line != null) {  
		                int index = line.indexOf(MAC_ADDRESS_PREFIX);  
		                if (index != -1) {  
		                    macAddress = line.substring(index + MAC_ADDRESS_PREFIX.length()).trim().toUpperCase();  
		                }  
		            }  
		        }  
		        br.close();  
		    } catch (IOException e) {  
		        e.printStackTrace(System.out);  
		    }  
		    return macAddress; 
	 
	 }
	 
}