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 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;
	 } 
	 
	 
	    
	 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; 
	 
	 }
}