package com.jeeplus.common.utils;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 根据IP地址获取详细的地域信息
 * @author Lwl
 * @dateJan 26, 2016
 */
public class AddressUtils {

    /**
     *
     * @param content
     *      请求的参数 格式为：name=xxx&pwd=xxx
     * @param encodingString
     *      服务器端请求编码。如GBK,UTF-8等
     * @return
     * @throws UnsupportedEncodingException
     */
    public String getAddresses(String content, String encodingString)
            throws UnsupportedEncodingException {
        // 这里调用pconline的接口
        String urlStr = "http://ip.taobao.com/service/getIpInfo.php";
        // 从http://whois.pconline.com.cn取得IP所在的省市区信息
        String returnStr = this.getResult(urlStr, content, encodingString);
        if (returnStr != null) {
            // 处理返回的省市区信息
            System.out.println(returnStr);
            String[] temp = returnStr.split(",");
            if(temp.length<3){
                return "0";//无效IP，局域网测试
            }
            String region = (temp[5].split(":"))[1].replaceAll("\"", "");
            region = decodeUnicode(region);// 省份

            String country = "";
            String area = "";
            // String region = "";
            String city = "";
            String county = "";
            String isp = "";
            for (int i = 0; i < temp.length; i++) {
                switch (i) {
                    case 1:
                        country = (temp[i].split(":"))[2].replaceAll("\"", "");
                        country = decodeUnicode(country);// 国家
                        break;
                    case 3:
                        area = (temp[i].split(":"))[1].replaceAll("\"", "");
                        area = decodeUnicode(area);// 地区
                        break;
                    case 5:
                        region = (temp[i].split(":"))[1].replaceAll("\"", "");
                        region = decodeUnicode(region);// 省份
                        break;
                    case 7:
                        city = (temp[i].split(":"))[1].replaceAll("\"", "");
                        city = decodeUnicode(city);// 市区
                        break;
                    case 9:
                        county = (temp[i].split(":"))[1].replaceAll("\"", "");
                        county = decodeUnicode(county);// 地区
                        break;
                    case 11:
                        isp = (temp[i].split(":"))[1].replaceAll("\"", "");
                        isp = decodeUnicode(isp); // ISP公司
                        break;
                }
            }

            System.out.println(country+area+region+city+county+isp);
            return new StringBuffer(country).append(area).append(region).append(city).append(county).append(isp).toString();
        }
        return null;
    }
    /**
     * @param urlStr
     *      请求的地址
     * @param content
     *      请求的参数 格式为：name=xxx&pwd=xxx
     * @param encoding
     *      服务器端请求编码。如GBK,UTF-8等
     * @return
     */
    private String getResult(String urlStr, String content, String encoding) {
        URL url = null;
        HttpURLConnection connection = null;
        try {
            url = new URL(urlStr);
            connection = (HttpURLConnection) url.openConnection();// 新建连接实例
            connection.setConnectTimeout(2000);// 设置连接超时时间，单位毫秒
            connection.setReadTimeout(33000);// 设置读取数据超时时间，单位毫秒
            connection.setDoOutput(true);// 是否打开输出流 true|false
            connection.setDoInput(true);// 是否打开输入流true|false
            connection.setRequestMethod("POST");// 提交方法POST|GET
            connection.setUseCaches(false);// 是否缓存true|false
            connection.connect();// 打开连接端口
            DataOutputStream out = new DataOutputStream(connection.getOutputStream());// 打开输出流往对端服务器写数据
            out.writeBytes(content);// 写数据,也就是提交你的表单 name=xxx&pwd=xxx
            out.flush();// 刷新
            out.close();// 关闭输出流
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    connection.getInputStream(), encoding));// 往对端写完数据对端服务器返回数据
            // ,以BufferedReader流来读取
            StringBuffer buffer = new StringBuffer();
            String line = "";
            while ((line = reader.readLine()) != null) {
                buffer.append(line);
            }
            reader.close();
            return buffer.toString();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                connection.disconnect();// 关闭连接
            }
        }
        return null;
    }
    /**
     * unicode 转换成 中文
     *
     * @author fanhui 2007-3-15
     * @param theString
     * @return
     */
    public static String decodeUnicode(String theString) {
        char aChar;
        int len = theString.length();
        StringBuffer outBuffer = new StringBuffer(len);
        for (int x = 0; x < len;) {
            aChar = theString.charAt(x++);
            if (aChar == '\\') {
                aChar = theString.charAt(x++);
                if (aChar == 'u') {
                    int value = 0;
                    for (int i = 0; i < 4; i++) {
                        aChar = theString.charAt(x++);
                        switch (aChar) {
                            case '0':
                            case '1':
                            case '2':
                            case '3':
                            case '4':
                            case '5':
                            case '6':
                            case '7':
                            case '8':
                            case '9':
                                value = (value << 4) + aChar - '0';
                                break;
                            case 'a':
                            case 'b':
                            case 'c':
                            case 'd':
                            case 'e':
                            case 'f':
                                value = (value << 4) + 10 + aChar - 'a';
                                break;
                            case 'A':
                            case 'B':
                            case 'C':
                            case 'D':
                            case 'E':
                            case 'F':
                                value = (value << 4) + 10 + aChar - 'A';
                                break;
                            default:
                                throw new IllegalArgumentException(
                                        "Malformed   encoding.");
                        }
                    }
                    outBuffer.append((char) value);
                } else {
                    if (aChar == 't') {
                        aChar = '\t';
                    } else if (aChar == 'r') {
                        aChar = '\r';
                    } else if (aChar == 'n') {
                        aChar = '\n';
                    } else if (aChar == 'f') {
                        aChar = '\f';
                    }
                    outBuffer.append(aChar);
                }
            } else {
                outBuffer.append(aChar);
            }
        }
        return outBuffer.toString();
    }
    // 测试
    public static void main(String[] args) {
       /* AddressUtils addressUtils = new AddressUtils();
        // 测试ip 219.136.134.157 中国=华南=广东省=广州市=越秀区=电信
        String ip = "106.39.83.114";
        String address = "";
        try {
            address = addressUtils.getAddresses("ip="+ip, "utf-8");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println(address);
        Date date = new Date();
        SimpleDateFormat sdfs = new SimpleDateFormat("HHmm");
        String dayms = sdfs.format(date);
        System.out.println(dayms);*/
        // 输出结果为：广东省,广州市,越秀区
        ScriptEngine se = new ScriptEngineManager().getEngineByName("JavaScript");
        //String[] arr = new String[]{"2","*","3","-","4","5","/","5","+","9","+","9","%","5"};
        //String str = "2*3-45/5+9+9%5";
        String str3 = "if(状态>4){2*3-45/5+9+9%5};\nif(开始日期>=20180101){2*3-45/5+9+9%5};\nif(项目开始==project&&结束日期>=20170101){2*3-45/5+9+9%5};\nif(开始日期>=20180101&&测试包含项目开始||开始日期>=20160101){2*3-45/5+9+9%5};";
        //String str3 = "if(age==2){2*3-45/5+9+9%5};\nif(status==2){2*3-45/5+9+9%5};\nif(type>=1){2*3-45/5+9+9%5};";
        String str4 = "if(18==2){2*3-45/5+9+9%5};\nif(5==2){2*3-45/5+9+9%5};\nif(1>=1){2*3-45/5+9+9%5};";
        String str5 = str3;
        FormulaStatusEnum[] values = FormulaStatusEnum.values();
        for (FormulaStatusEnum value:values){
            if (str3.contains(value.getDesc())){
                str3 = str3.replaceAll(value.getDesc(),value.getValue());
                str5 = str5.replaceAll(value.getDesc(),value.getDesc()+"["+value.getValue()+"]");
            }
        }
        FormulaStrEnum[] valuestr = FormulaStrEnum.values();
        for (FormulaStrEnum value:valuestr){
            if (str3.contains(value.getDesc())){
                str3 = str3.replaceAll(value.getDesc(),value.getValue());
                str5 = str5.replaceAll(value.getDesc(),value.getDesc()+"["+value.getValue()+"]");
            }
        }
        try {
            String[] strarr = str3.split("if");
            String[] strarrs = str5.split("if");
            String strss = "";
            System.out.println("str3:"+str3);
            System.out.println("str5:"+str5);
            for (int i=0;i<strarr.length;i++){
                String strs = strarr[i];
                String strsif = strarrs[i];
                String strInfo = strs;
                if (StringUtils.isNotBlank(strs)){
                    String strIf = strs.split("\\(")[1].split("\\)")[0];
                    String strsIfs = strsif.split("\\(")[1].split("\\)")[0];
                    if (strIf.contains("&&") && !strIf.contains("||")){
                        String[] arr = strIf.split("&&");
                        for (String s:arr){
                            if (strIf.contains("==")) {
                                String str2 = s.split("==")[1];
                                String str1 = s.split("==")[0];
                                if (str1.equals(str2)) {
                                    strInfo = strInfo.replace(strIf, "1==1");
                                } else {
                                    strInfo = strInfo.replace(strIf, "1>1");
                                    break;
                                }
                            }else if (strIf.contains("包含")) {
                                String str2 = s.split("包含")[1];
                                String str1 = s.split("包含")[0];
                                if (str1.contains(str2)) {
                                    strInfo = strInfo.replace(strIf, "1==1");
                                } else {
                                    strInfo = strInfo.replace(strIf, "1>1");
                                    break;
                                }
                            }
                        }
                    }else if (strIf.contains("||") && !strIf.contains("&&")){
                        String[] arr = strIf.split("\\|\\|");
                        System.out.println("arr:"+arr.length);
                        for (String s:arr){
                            if (s.contains("==")) {
                                String str1 = s.split("==")[0];
                                String str2 = s.split("==")[1];
                                if (str1.equals(str2)) {
                                    strInfo = strInfo.replace(strIf, "1==1");
                                    break;
                                } else {
                                    strInfo = strInfo.replace(strIf, "1>1");
                                }
                            }else if (strIf.contains("包含")) {
                                String str2 = s.split("包含")[1];
                                String str1 = s.split("包含")[0];
                                if (str1.contains(str2)) {
                                    strInfo = strInfo.replace(strIf, "1==1");
                                    break;
                                } else {
                                    strInfo = strInfo.replace(strIf, "1>1");
                                }
                            }
                        }
                    }else if (strIf.contains("&&") && strIf.contains("||")){
                        String[] arr = strIf.split("&&");
                        int count = 0;
                        for (String s:arr) {
                            if (s.contains("||")) {
                                String[] arr2 = s.split("\\|\\|");
                                System.out.println("arr:"+arr.length);
                                for (String s2:arr2){
                                    if (s2.contains("==")) {
                                        String str2 = s2.split("==")[1];
                                        String str1 = s2.split("==")[0];
                                        if (str1.equals(str2)) {
                                            count++;
                                            break;
                                        }
                                    }else if (s2.contains("包含")) {
                                        String str2 = s2.split("包含")[1];
                                        String str1 = s2.split("包含")[0];
                                        if (str1.contains(str2)) {
                                            count++;
                                            break;
                                        }
                                    }else {
                                        if (se.eval(s2)!=null){
                                            if (Boolean.parseBoolean(se.eval(s).toString())){
                                                count++;
                                                break;
                                            }
                                        }
                                    }
                                }
                            } else {
                                if (s.contains("==")) {
                                    String str2 = s.split("==")[1];
                                    String str1 = s.split("==")[0];
                                    if (str1.equals(str2)) {
                                        count++;
                                    }
                                } else if (s.contains("包含")) {
                                    String str2 = s.split("包含")[1];
                                    String str1 = s.split("包含")[0];
                                    if (str1.contains(str2)) {
                                        count++;
                                    }
                                }else {
                                    if (se.eval(s)!=null){
                                        System.out.println("se.eval(s):"+se.eval(s));
                                        if (Boolean.parseBoolean(se.eval(s).toString())){
                                            count++;
                                        }
                                    }
                                }
                            }
                        }
                        if (count == arr.length){
                            strInfo = strInfo.replace(strIf, "1==1");
                        }else {
                            strInfo = strInfo.replace(strIf, "1>1");
                        }
                    }else{
                        if (strIf.contains("==")) {
                            String str2 = strIf.split("==")[1];
                            String str1 = strIf.split("==")[0];
                            if (str1.equals(str2)) {
                                strInfo = strInfo.replace(strIf, "1==1");
                            } else {
                                strInfo = strInfo.replace(strIf, "1>1");
                            }
                        }else if (strIf.contains("包含")) {
                            String str2 = strIf.split("包含")[1];
                            String str1 = strIf.split("包含")[0];
                            if (str1.contains(str2)) {
                                strInfo = strInfo.replace(strIf, "1==1");
                            } else {
                                strInfo = strInfo.replace(strIf, "1>1");
                            }
                        }
                    }

                    strss += "如果(" +strsIfs+")那么{";
                    Object d = se.eval("if"+strInfo);
                    if (d!=null){
                        Double ds = Double.parseDouble(d.toString());
                        if (ds!=null) {
                            strss += "值为" + ds + "};\n";
                        }else {
                            strss += "};\n";
                        }
                    }else {
                        strss += "};\n";
                    }
                }
            }
            System.out.println("strss.s----:"+strss);
        } catch (ScriptException e) {
            e.printStackTrace();
        }
    }


}