package com.gyee.frame.util.golden;


import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.gyee.frame.common.conf.V2Config;
import com.gyee.frame.model.auto.WindPowerStationTestingPoint;
import com.gyee.frame.model.auto.WindTurbineTestingPointAi;
import com.gyee.frame.model.custom.DNAStatVal;
import com.gyee.frame.model.custom.DNAVal;
import com.gyee.frame.model.custom.PointData;
import com.gyee.frame.util.IRealTimeDataBaseUtil;
import com.gyee.frame.util.StringUtils;
import com.gyee.frame.util.golden.timeseries.ErrorRequest;
import com.gyee.frame.util.golden.timeseries.JsonObjectHelper;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.client.RestTemplate;

import java.util.*;

/**
 */
public class EdosUtil implements IRealTimeDataBaseUtil {




    private RestTemplate restTemplate =new RestTemplate();

    static String baseURL = V2Config.getBaseurl();

    @Override
    public PointData getRealData(WindPowerStationTestingPoint point) throws Exception {
        try {
            Optional<String> keys = Optional.ofNullable(point.getCode());
            Optional<String> thingType = Optional.ofNullable("station");
            Optional<String> thingId = Optional.ofNullable(point.getWindpowerstationid());
            Optional<String> uniformCodes = Optional.ofNullable(point.getUniformcode());

            String url = baseURL + "/latest?null=0";
            if (keys.isPresent())
                url = url + "&keys=" + keys.get();
            if (thingType.isPresent())
                url = url + "&thingType=" + thingType.get();
            if (thingId.isPresent())
                url = url + "&thingId=" + thingId.get();
            if (uniformCodes.isPresent())
                url = url + "&uniformCodes=" + uniformCodes.get();

            ResponseEntity<JSONObject> resp = restTemplate.getForEntity(url, JSONObject.class);
            JSONObject jsonArray = resp.getBody();
            if (StringUtils.isNotEmpty(jsonArray)){
                List<PointData> list = JsonObjectHelper.phrasePointData(jsonArray);
                if (list.size() > 0)
                    return list.get(0);
                else
                    return ErrorRequest.RequestError(point.getCode());
            } else {
                return ErrorRequest.RequestError(point.getCode());
            }
        } catch (HttpClientErrorException exception) {
            if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
                //System.out.println("404请求错误");
                return ErrorRequest.RequestError(point.getCode());
            } else {
                throw exception;
            }
        }
    }


    @Override
    public List<PointData> getHistoryDatasSnap(WindPowerStationTestingPoint point, Long beginDate, Long endDate, Long count, Long pried) throws Exception {
        Optional<String> tagName = Optional.ofNullable(point.getCode());
        Optional<String> thingId = Optional.ofNullable(point.getWindpowerstationid());
        Optional<String> thingType = Optional.ofNullable(point.getModelid());
        Optional<String> uniformCode = Optional.ofNullable(point.getUniformcode());
        Optional<Long> startTs = Optional.ofNullable(beginDate * 1000);
        Optional<Long> endTs = Optional.ofNullable(endDate * 1000);
        //通过时间区间和时间间隔获取点数
        Long finalInterval;
        if (pried != null)
            finalInterval = pried;
        else if (count != null)
            finalInterval = (endDate - beginDate) / count;
        else
            return ErrorRequest.RequestListError(point.getCode());
        Optional<Integer> interval = Optional.ofNullable(Integer.parseInt(finalInterval.toString()));

        try {
            String url = baseURL + "/history/snap?null=0";
            //tagName 或thingType，thingId，uniformCode可以确定一个标签点
            if (tagName.isPresent())
                url = url + "&tagName=" + tagName.get();
            else {
                if (thingType.isPresent())
                    url = url + "&thingType=" + thingType.get();
                if (thingId.isPresent())
                    url = url + "&thingId=" + thingId.get();
                if (uniformCode.isPresent())
                    url = url + "&uniformCodes=" + uniformCode.get();
            }
            if (startTs.isPresent())
                url = url + "&startTs=" + startTs.get();
            if (endTs.isPresent())
                url = url + "&endTs=" + endTs.get();
            if (interval.isPresent())
                url = url + "&interval=" + interval.get();

            ResponseEntity<JSONArray> resp = restTemplate.getForEntity(url, JSONArray.class);
            JSONArray jsonArray = resp.getBody();
            if (jsonArray != null) {
                List<PointData> snapList = JsonObjectHelper.phrasePointData(jsonArray, point.getCode());
                List<PointData> resultList = new ArrayList<>();

                if(snapList.isEmpty())
                {

                    getHistsnapSameTiem(point.getCode(), beginDate, pried, resultList);
                }else
                {
                    for (PointData snapItem : snapList) {

                        long subTime = snapItem.getPointTime() - pried;
                        //查询时间区间的截面值(截面值为传入时间节点的上一个最近值，返回时间为值的真实时间)，
                        // 再进行比较，若截面值的时间戳在以快照时间节点前推一个单位的时间区间中，
                        // 则代表该时间节点快照有效，否则为0
                        String rawUrl = baseURL + "/history/section?null=0&tagNames=" + point.getCode() + "&ts=" + snapItem.getPointTime() + "000";
                        ResponseEntity<JSONObject> sectionResp = restTemplate.getForEntity(rawUrl, JSONObject.class);
                        JSONObject jsonObjectSection = sectionResp.getBody();

                        if (jsonObjectSection != null) {
                            List<PointData> sectionlist = JsonObjectHelper.phrasePointData(jsonObjectSection);
                            if (sectionlist.size() > 0) {
                                if(sectionlist.get(0).getPointTime()>=subTime&&sectionlist.get(0).getPointTime()<=snapItem.getPointTime()){
                                    resultList.add(snapItem);
                                }
                                else{
                                    PointData data = new PointData();
                                    data.setEdnaId(point.getCode());
                                    data.setPointTime(snapItem.getPointTime());
                                    data.setPointValue("0");
                                    data.setPointName("1");
                                    data.setPointValueInDouble(0.0);
                                    resultList.add(data);
                                }
                            } else {
                                PointData data = new PointData();
                                data.setEdnaId(point.getCode());
                                data.setPointTime(snapItem.getPointTime());
                                data.setPointValue("0");
                                data.setPointName("1");
                                data.setPointValueInDouble(0.0);
                                resultList.add(data);
                            }
                        } else {
                            PointData data = new PointData();
                            data.setEdnaId(point.getCode());
                            data.setPointTime(snapItem.getPointTime());
                            data.setPointValue("0");
                            data.setPointName("1");
                            data.setPointValueInDouble(0.0);
                            resultList.add(data);
                        }
                    }
                }


                return resultList;


            } else {
                return ErrorRequest.RequestListError(point.getCode());
            }

        } catch (HttpClientErrorException exception) {
            if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
                //System.out.println("404请求错误");
                return ErrorRequest.RequestListError(point.getCode());
            } else {
                throw exception;
            }
        }

    }


    private void getHistsnapSameTiem(String pointid, Long beginDate, Long pried,
                                     List<PointData> resultList) {
        long subTime =beginDate - pried;
        String rawUrl = baseURL + "/history/section?null=0&tagNames=" + pointid + "&ts=" + beginDate + "000";
        ResponseEntity<JSONObject> sectionResp = restTemplate.getForEntity(rawUrl, JSONObject.class);
        JSONObject jsonObjectSection = sectionResp.getBody();
        if (jsonObjectSection != null) {
            List<PointData> sectionlist = JsonObjectHelper.phrasePointData(jsonObjectSection);
            if (sectionlist.size() > 0) {
                if(sectionlist.get(0).getPointTime()>=subTime&&sectionlist.get(0).getPointTime()<=beginDate){
                    resultList.add(sectionlist.get(0));
                }
                else{
                    PointData data = new PointData();
                    data.setEdnaId(pointid);
                    data.setPointTime(sectionlist.get(0).getPointTime());
                    data.setPointValue("0");
                    data.setPointName("1");
                    data.setPointValueInDouble(0.0);
                    resultList.add(data);
                }
            } else {
                PointData data = new PointData();
                data.setEdnaId(pointid);
                data.setPointTime(sectionlist.get(0).getPointTime());
                data.setPointValue("0");
                data.setPointName("1");
                data.setPointValueInDouble(0.0);
                resultList.add(data);
            }
        } else {
            PointData data = new PointData();
            data.setEdnaId(pointid);
            data.setPointTime(beginDate);
            data.setPointValue("0");
            data.setPointName("1");
            data.setPointValueInDouble(0.0);
            resultList.add(data);
        }
    }


    @Override
    public List<PointData> getHistoryDatasRaw(WindPowerStationTestingPoint point, Long beginDate, Long endDate) throws Exception {
        Optional<String> tagName = Optional.ofNullable(point.getCode());
        Optional<String> thingId = Optional.ofNullable(point.getWindpowerstationid());
        Optional<String> thingType = Optional.ofNullable(point.getModelid());
        Optional<String> uniformCode = Optional.ofNullable(point.getUniformcode());
        Optional<Long> startTs = Optional.ofNullable(beginDate * 1000);
        Optional<Long> endTs = Optional.ofNullable(endDate * 1000);

        try {
            String url = baseURL + "/history/snap?null=0";
            //tagName 或thingType，thingId，uniformCode可以确定一个标签点
            if (tagName.isPresent())
                url = url + "&tagName=" + tagName.get();
            else {
                if (thingType.isPresent())
                    url = url + "&thingType=" + thingType.get();
                if (thingId.isPresent())
                    url = url + "&thingId=" + thingId.get();
                if (uniformCode.isPresent())
                    url = url + "&uniformCodes=" + uniformCode.get();
            }

            if (startTs.isPresent())
                url = url + "&startTs=" + startTs.get();
            if (endTs.isPresent())
                url = url + "&endTs=" + endTs.get();

            ResponseEntity<JSONArray> resp = restTemplate.getForEntity(url, JSONArray.class);
            JSONArray jsonArray = resp.getBody();
            if (jsonArray != null)
                return JsonObjectHelper.phrasePointData(jsonArray, point.getCode());
            else {
                return ErrorRequest.RequestListError(point.getCode());
            }

        } catch (HttpClientErrorException exception) {
            if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
                //System.out.println("404请求错误");
                return ErrorRequest.RequestListError(point.getCode());
            } else {
                throw exception;
            }
        }
    }

    @Override
    public PointData getRealData(WindTurbineTestingPointAi point) throws Exception {
        Optional<String> keys = Optional.ofNullable(point.getId());
        Optional<String> thingType = Optional.ofNullable(point.getModelid());
        Optional<String> thingId = Optional.ofNullable(point.getWindpowerstationid());
        Optional<String> uniformCodes = Optional.ofNullable(point.getUniformcode());

        try {
            String url = baseURL + "/latest?null=0";
            //tagName 或thingType，thingId，uniformCode可以确定一个标签点
            if (keys.isPresent())
                url = url + "&keys=" + keys.get();
            else {
                if (thingType.isPresent())
                    url = url + "&thingType=" + thingType.get();
                if (thingId.isPresent())
                    url = url + "&thingId=" + thingId.get();
                if (uniformCodes.isPresent())
                    url = url + "&uniformCodes=" + uniformCodes.get();
            }
            ResponseEntity<JSONObject> resp = restTemplate.getForEntity(url, JSONObject.class);
            JSONObject jsonArray = resp.getBody();
            if (StringUtils.isNotEmpty(jsonArray)){
                List<PointData> list = JsonObjectHelper.phrasePointData(jsonArray);
                if (list.size() > 0)
                    return list.get(0);
                else
                    return ErrorRequest.RequestError(point.getId());
            } else {
                return ErrorRequest.RequestError(point.getId());
            }

        } catch (HttpClientErrorException exception) {
            if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
                //System.out.println("404请求错误");
                return ErrorRequest.RequestError(point.getId());
            } else {
                throw exception;
            }
        }
    }

    @Override
    public List<PointData> getHistoryDatasSnap(WindTurbineTestingPointAi point, Long beginDate, Long endDate, Long count, Long pried) throws Exception {
        Optional<String> tagName = Optional.ofNullable(point.getId());
        Optional<String> thingId = Optional.ofNullable(point.getWindpowerstationid());
        Optional<String> thingType = Optional.ofNullable(point.getModelid());
        Optional<String> uniformCode = Optional.ofNullable(point.getUniformcode());
        Optional<Long> startTs = Optional.ofNullable(beginDate * 1000);
        Optional<Long> endTs = Optional.ofNullable(endDate * 1000);
        //通过时间区间和时间间隔获取点数
        Long finalInterval;
        if (pried != null)
            finalInterval = pried;
        else if (count != null)
            finalInterval = (endDate - beginDate) / count;
        else
            return ErrorRequest.RequestListError(point.getId());
        Optional<Integer> interval = Optional.ofNullable(Integer.parseInt(finalInterval.toString()));

        try {
            String url = baseURL + "/history/snap?null=0";
            //tagName 或thingType，thingId，uniformCode可以确定一个标签点
            if (tagName.isPresent())
                url = url + "&tagName=" + tagName.get();
            else {
                if (thingType.isPresent())
                    url = url + "&thingType=" + thingType.get();
                if (thingId.isPresent())
                    url = url + "&thingId=" + thingId.get();
                if (uniformCode.isPresent())
                    url = url + "&uniformCodes=" + uniformCode.get();
            }
            if (startTs.isPresent())
                url = url + "&startTs=" + startTs.get();
            if (endTs.isPresent())
                url = url + "&endTs=" + endTs.get();
            if (interval.isPresent())
                url = url + "&interval=" + interval.get();

            ResponseEntity<JSONArray> resp = restTemplate.getForEntity(url, JSONArray.class);
            JSONArray jsonArray = resp.getBody();
            if (jsonArray != null) {
                List<PointData> snapList = JsonObjectHelper.phrasePointData(jsonArray, point.getId());
                List<PointData> resultList = new ArrayList<>();

                if(snapList.isEmpty())
                {

                    getHistsnapSameTiem(point.getId(), beginDate, pried, resultList);
                }else
                {
                    for (PointData snapItem : snapList) {
                        long subTime = snapItem.getPointTime() - pried;
                        //查询时间区间的截面值(截面值为传入时间节点的上一个最近值，返回时间为值的真实时间)，
                        // 再进行比较，若截面值的时间戳在以快照时间节点前推一个单位的时间区间中，
                        // 则代表该时间节点快照有效，否则为0
                        String rawUrl = baseURL + "/history/section?null=0&tagNames=" + point.getId() + "&ts=" + snapItem.getPointTime() + "000";
                        ResponseEntity<JSONObject> sectionResp = restTemplate.getForEntity(rawUrl, JSONObject.class);
                        JSONObject jsonObjectSection = sectionResp.getBody();

                        if (jsonObjectSection != null) {
                            List<PointData> sectionlist = JsonObjectHelper.phrasePointData(jsonObjectSection);
                            if (sectionlist.size() > 0) {
                                if(sectionlist.get(0).getPointTime()>=subTime&&sectionlist.get(0).getPointTime()<=snapItem.getPointTime()){
                                    resultList.add(snapItem);
                                }
                                else{
                                    PointData data = new PointData();
                                    data.setEdnaId(point.getId());
                                    data.setPointTime(snapItem.getPointTime());
                                    data.setPointValue("0");
                                    data.setPointName("1");
                                    data.setPointValueInDouble(0.0);
                                    resultList.add(data);
                                }
                            } else {
                                PointData data = new PointData();
                                data.setEdnaId(point.getId());
                                data.setPointTime(snapItem.getPointTime());
                                data.setPointValue("0");
                                data.setPointName("1");
                                data.setPointValueInDouble(0.0);
                                resultList.add(data);
                            }
                        } else {
                            PointData data = new PointData();
                            data.setEdnaId(point.getId());
                            data.setPointTime(snapItem.getPointTime());
                            data.setPointValue("0");
                            data.setPointName("1");
                            data.setPointValueInDouble(0.0);
                            resultList.add(data);
                        }
                    }
                }


                return resultList;
            } else {
                return ErrorRequest.RequestListError(point.getId());
            }
        } catch (HttpClientErrorException exception) {
            if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
                //System.out.println("404请求错误");
                return ErrorRequest.RequestListError(point.getId());
            } else {
                throw exception;
            }
        }
    }


    @Override
    public List<PointData> getHistoryDatasRaw(WindTurbineTestingPointAi point, Long beginDate, Long endDate) throws Exception {
        Optional<String> tagName = Optional.ofNullable(point.getId());
        Optional<String> thingId = Optional.ofNullable(point.getWindpowerstationid());
        Optional<String> thingType = Optional.ofNullable(point.getModelid());
        Optional<String> uniformCode = Optional.ofNullable(point.getUniformcode());
        Optional<Long> startTs = Optional.ofNullable(beginDate);
        Optional<Long> endTs = Optional.ofNullable(endDate);
        try {
            String url = baseURL + "/history/snap?null=0";
            //tagName 或thingType，thingId，uniformCode可以确定一个标签点
            if (tagName.isPresent())
                url = url + "&tagName=" + tagName.get();
            else {
                if (thingType.isPresent())
                    url = url + "&thingType=" + thingType.get();
                if (thingId.isPresent())
                    url = url + "&thingId=" + thingId.get();
                if (uniformCode.isPresent())
                    url = url + "&uniformCodes=" + uniformCode.get();
            }

            if (startTs.isPresent())
                url = url + "&startTs=" + startTs.get();
            if (endTs.isPresent())
                url = url + "&endTs=" + endTs.get();

            ResponseEntity<JSONArray> resp = restTemplate.getForEntity(url, JSONArray.class);
            JSONArray jsonArray = resp.getBody();
            if (jsonArray != null)
                return JsonObjectHelper.phrasePointData(jsonArray, point.getId());
            else {
                return ErrorRequest.RequestListError(point.getId());
            }
        } catch (HttpClientErrorException exception) {
            if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
                //System.out.println("404请求错误");
                return ErrorRequest.RequestListError(point.getId());
            } else {
                throw exception;
            }
        }
    }

    @Override
    public PointData getRealData(String pointid) throws Exception {
        Optional<String> keys = Optional.ofNullable(pointid);
        String url = baseURL + "/latest?null=0";
        try {
            if (keys.isPresent())
                url = url + "&keys=" + keys.get();
            else
                return null;

            ResponseEntity<JSONObject> resp = restTemplate.getForEntity(url, JSONObject.class);
            JSONObject jsonArray = resp.getBody();
            if (StringUtils.isNotEmpty(jsonArray)){
                List<PointData> list = JsonObjectHelper.phrasePointData(jsonArray);
                if (list.size() > 0)
                    return list.get(0);
                else
                    return ErrorRequest.RequestError(pointid);
            } else {
                return ErrorRequest.RequestError(pointid);
            }

        } catch (HttpClientErrorException exception) {
            if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
                //System.out.println("404请求错误");
                return ErrorRequest.RequestError(pointid);
            } else {
                return ErrorRequest.RequestError(pointid);
            }
        }
    }

    @Override
    public List<PointData> getRealData(String... pointids) throws Exception {
        String pointIdString = StringUtil.join(pointids, ",");
        Optional<String> keys = Optional.ofNullable(pointIdString);
        String url = baseURL + "/latest?null=0";
        try {
            if (keys.isPresent())
                url = url + "&keys=" + keys.get();
            else {
                return ErrorRequest.RequestListError(pointids);
            }
            ResponseEntity<JSONObject> resp = restTemplate.getForEntity(url, JSONObject.class);
            JSONObject jsonObject = resp.getBody();
            if (jsonObject != null) {
                //对结果进行有序返回
                int len = pointids.length;
                List<PointData> result = new ArrayList<>();
                HashMap<String, PointData> pointDataHashMap = new HashMap<>();
                for (int i = 0; i < len; i++) {

                    if (pointDataHashMap.containsKey(pointids[i]) == false){
                        PointData pd = new PointData();
                        pd.setPointName(pointids[i]);
                        pd.setEdnaId(pointids[i]);
                        result.add(pd);

                        pointDataHashMap.put(pd.getPointName(), pd);
                    }
                    else{
                        result.add(pointDataHashMap.get(pointids[i]));
                    }

                }
                Iterator<String> sIterator = jsonObject.keySet().iterator();
                while (sIterator.hasNext()) {
                    // 获得key
                    String key = sIterator.next();
                    PointData pointData = pointDataHashMap.get(key);
                    if (pointData == null)
                        continue;
                    // 根据key获得value, value也可以是JSONObject,JSONArray,使用对应的参数接收即可
                    JSONObject jsonData = jsonObject.getJSONObject(key);
                    Long ts = jsonData.getLong("ts");
                    String pointValue = null;
                    if (jsonData.containsKey("doubleValue")) {
                        pointValue = jsonData.getString("doubleValue");
                    } else if (jsonData.containsKey("booleanValue")) {
                        pointValue = jsonData.getString("booleanValue");
                    } else if (jsonData.containsKey("longValue")) {
                        pointValue = jsonData.getString("longValue");
                    } else if (jsonData.containsKey("stringValue")) {
                        pointValue = jsonData.getString("stringValue");
                    }
//                    pointData.setPointValue(pointValue);
//                    pointData.setPointValueInDouble(Double.parseDouble(pointValue));

                    if(pointValue.equals("true"))
                    {
                        pointData.setPointValueInDouble(1.0);
                    }else if(pointValue.equals("false"))
                    {
                        pointData.setPointValueInDouble(0.0);
                    }else
                    {
                        pointData.setPointValueInDouble(Double.parseDouble(pointValue));
                    }
                    pointData.setPointValue(pointValue);
                    // //System.out.println("key= " + key + ", ts = " + ts + ", value = " + pointValue);
                }
                return result;

            } else {
                return ErrorRequest.RequestListError(pointids);
            }

        } catch (HttpClientErrorException exception) {
            if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
                //System.out.println("404请求错误");
                return ErrorRequest.RequestListError(pointids);
            } else {
                throw exception;
            }
        }
    }



    @Override
    public List<PointData> getRealData(List<String> pointids) throws Exception {
        String pointIdString = StringUtil.join(pointids.toArray(), ",");
        Optional<String> keys = Optional.ofNullable(pointIdString);
        String url = baseURL + "/latest?null=0";
        try {
            if (keys.isPresent())
                url = url + "&keys=" + keys.get();
            else {
                String[] arr = new String[pointids.size()];
                return ErrorRequest.RequestListError(pointids.toArray(arr));
            }

            ResponseEntity<JSONObject> resp = restTemplate.getForEntity(url, JSONObject.class);
            JSONObject jsonObject = resp.getBody();
            if (jsonObject != null) {


                //对结果进行有序返回
                int len = pointids.size();
                List<PointData> result = new ArrayList<>();
                HashMap<String, PointData> pointDataHashMap = new HashMap<>();
                for (int i = 0; i < len; i++) {
                    if (pointDataHashMap.containsKey(pointids.get(i)) == false){
                        PointData pd = new PointData();
                        pd.setPointName(pointids.get(i));
                        pd.setEdnaId(pointids.get(i));
                        result.add(pd);

                        pointDataHashMap.put(pd.getPointName(), pd);
                    }
                    else{
                        result.add(pointDataHashMap.get(pointids.get(i)));
                    }
                }
                Iterator<String> sIterator = jsonObject.keySet().iterator();
                while (sIterator.hasNext()) {
                    // 获得key
                    String key = sIterator.next();
                    PointData pointData = pointDataHashMap.get(key);
                    if (pointData == null)
                        continue;
                    // 根据key获得value, value也可以是JSONObject,JSONArray,使用对应的参数接收即可
                    JSONObject jsonData = jsonObject.getJSONObject(key);
                    Long ts = jsonData.getLong("ts");
                    String pointValue = null;
                    if (jsonData.containsKey("doubleValue")) {
                        pointValue = jsonData.getString("doubleValue");
                    } else if (jsonData.containsKey("booleanValue")) {
                        pointValue = jsonData.getString("booleanValue");
                    } else if (jsonData.containsKey("longValue")) {
                        pointValue = jsonData.getString("longValue");
                    } else if (jsonData.containsKey("stringValue")) {
                        pointValue = jsonData.getString("stringValue");
                    }
                    if(pointValue.equals("true"))
                    {
                        pointData.setPointValueInDouble(1.0);
                    }else if(pointValue.equals("false"))
                    {
                        pointData.setPointValueInDouble(0.0);
                    }else
                    {
                        pointData.setPointValueInDouble(Double.parseDouble(pointValue));
                    }
                    pointData.setPointValue(pointValue);

                    //  //System.out.println("key= " + key + ", ts = " + ts + ", value = " + pointValue);
                }
                return result;

            } else {
                String[] arr = new String[pointids.size()];
                return ErrorRequest.RequestListError(pointids.toArray(arr));
            }

        } catch (HttpClientErrorException exception) {
            if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
                //System.out.println("404请求错误");
                String[] arr = new String[pointids.size()];
                return ErrorRequest.RequestListError(pointids.toArray(arr));
            } else {
                throw exception;
            }
        }
    }

    @Override
    public Map<String, Double> getRealDataMap(String... pointids) throws Exception {
        String pointIdString = StringUtil.join(pointids, ",");
        Optional<String> keys = Optional.ofNullable(pointIdString);
        String url = baseURL + "/latest?null=0";
        try {
            if (keys.isPresent())
                url = url + "&keys=" + keys.get();
            else
                return null;
            ResponseEntity<JSONObject> resp = restTemplate.getForEntity(url, JSONObject.class);
            JSONObject jsonArray = resp.getBody();
            if (StringUtils.isNotEmpty(jsonArray)){
                Iterator<String> sIterator = jsonArray.keySet().iterator();
                Map<String, Double> resultMap = new HashMap();
                while (sIterator.hasNext()) {
                    // 获得key
                    String key = sIterator.next();
                    // 根据key获得value, value也可以是JSONObject,JSONArray,使用对应的参数接收即可
                    JSONObject jsonData = jsonArray.getJSONObject(key);
                    Long ts = jsonData.getLong("ts");
                    String pointValue = null;
                    if (jsonData.containsKey("doubleValue")) {
                        pointValue = jsonData.getString("doubleValue");
                    } else if (jsonData.containsKey("booleanValue")) {
                        pointValue = jsonData.getString("booleanValue");
                    } else if (jsonData.containsKey("longValue")) {
                        pointValue = jsonData.getString("longValue");
                    } else if (jsonData.containsKey("stringValue")) {
                        pointValue = jsonData.getString("stringValue");
                    }
                    resultMap.put(key, Double.parseDouble(pointValue));
                }
                return resultMap;

            } else
                return ErrorRequest.RequestMapError();
        } catch (HttpClientErrorException exception) {
            if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
                //System.out.println("404请求错误");
                return ErrorRequest.RequestMapError();
            } else {
                throw exception;
            }
        }
    }


    @Override
    public List<PointData> getHistoryDatasSnap(String pointid, Long beginDate, Long endDate, Long count, Long pried) throws Exception {
        Optional<String> tagName = Optional.ofNullable(pointid);
        Optional<Long> startTs = Optional.ofNullable(beginDate * 1000);
        Optional<Long> endTs = Optional.ofNullable(endDate * 1000);

        //通过时间区间和时间间隔获取点数
        Long finalInterval;
        if (pried != null)
            finalInterval = pried;
        else if (count != null)
            finalInterval = (endDate - beginDate) / count;
        else
            return ErrorRequest.RequestListError(pointid);
        Optional<Integer> interval = Optional.ofNullable(Integer.parseInt(finalInterval.toString()));

        try {
            String url = baseURL + "/history/snap?null=0";
            //tagName 或thingType，thingId，uniformCode可以确定一个标签点
            if (tagName.isPresent())
                url = url + "&tagName=" + tagName.get();

            if (startTs.isPresent())
                url = url + "&startTs=" + startTs.get();
            if (endTs.isPresent())
                url = url + "&endTs=" + endTs.get();
            if (interval.isPresent())
                url = url + "&interval=" + interval.get();

            ResponseEntity<JSONArray> resp = restTemplate.getForEntity(url, JSONArray.class);
            JSONArray jsonArray = resp.getBody();
            if (jsonArray != null) {
                List<PointData> list = JsonObjectHelper.phrasePointData(jsonArray,tagName.get());
                List<PointData> resultList = new ArrayList<>();

                if(list.isEmpty())
                {

                    getHistsnapSameTiem(pointid, beginDate, pried, resultList);
                }else
                {
                    for (PointData snapItem : list) {
                        long subTime = snapItem.getPointTime() - pried;
                        //查询时间区间的截面值(截面值为传入时间节点的上一个最近值，返回时间为值的真实时间)，
                        // 再进行比较，若截面值的时间戳在以快照时间节点前推一个单位的时间区间中，
                        // 则代表该时间节点快照有效，否则为0
                        String rawUrl = baseURL + "/history/section?null=0&tagNames=" +pointid+ "&ts=" + snapItem.getPointTime() + "000";
                        ResponseEntity<JSONObject> sectionResp = restTemplate.getForEntity(rawUrl, JSONObject.class);
                        JSONObject jsonObjectSection = sectionResp.getBody();

                        if (jsonObjectSection != null) {
                            List<PointData> sectionlist = JsonObjectHelper.phrasePointData(jsonObjectSection);
                            if (sectionlist.size() > 0) {
                                if(sectionlist.get(0).getPointTime()>=subTime&&sectionlist.get(0).getPointTime()<=snapItem.getPointTime()){
                                    resultList.add(snapItem);
                                }
                                else{
                                    PointData data = new PointData();
                                    data.setEdnaId(pointid);
                                    data.setPointTime(snapItem.getPointTime());
                                    data.setPointValue("0");
                                    data.setPointName("1");
                                    data.setPointValueInDouble(0.0);
                                    resultList.add(data);
                                }
                            } else {
                                PointData data = new PointData();
                                data.setEdnaId(pointid);
                                data.setPointTime(snapItem.getPointTime());
                                data.setPointValue("0");
                                data.setPointName("1");
                                data.setPointValueInDouble(0.0);
                                resultList.add(data);
                            }
                        } else {
                            PointData data = new PointData();
                            data.setEdnaId(pointid);
                            data.setPointTime(snapItem.getPointTime());
                            data.setPointValue("0");
                            data.setPointName("1");
                            data.setPointValueInDouble(0.0);
                            resultList.add(data);
                        }
                    }
                }

                return resultList;
            } else {
                return ErrorRequest.RequestListError(pointid);
            }

        } catch (HttpClientErrorException exception) {
            if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
                //System.out.println("404请求错误");
                return ErrorRequest.RequestListError(pointid);
            } else {
                throw exception;
            }
        }

    }


    @Override
    public List<PointData> getHistoryDatasRaw(String pointid, Long beginDate, Long endDate) throws Exception {
        Optional<String> tagName = Optional.ofNullable(pointid);
        Optional<Long> startTs = Optional.ofNullable(beginDate * 1000);
        Optional<Long> endTs = Optional.ofNullable(endDate * 1000);

        try {
            String url = baseURL + "/history/raw?null=0";
            //tagName 或thingType，thingId，uniformCode可以确定一个标签点
            if (tagName.isPresent())
                url = url + "&tagName=" + tagName.get();
            if (startTs.isPresent())
                url = url + "&startTs=" + startTs.get();
            if (endTs.isPresent())
                url = url + "&endTs=" + endTs.get();

            ResponseEntity<JSONArray> resp = restTemplate.getForEntity(url, JSONArray.class);

            JSONArray jsonArray = resp.getBody();
            if (jsonArray != null)
                return JsonObjectHelper.phrasePointData(jsonArray, pointid);
            else {
                return ErrorRequest.RequestListError(pointid);
            }
        } catch (HttpClientErrorException exception) {
            if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
                //System.out.println("404请求错误");
                return ErrorRequest.RequestListError(pointid);
            } else {
                throw exception;
            }
        }
    }

    @Override
    public List<PointData> getHistStat(WindTurbineTestingPointAi point, Long beginDate, Long endDate, Long count, Long pried, int type) throws Exception {
        Optional<String> tagName = Optional.ofNullable(point.getId());
        Optional<String> thingId = Optional.ofNullable(point.getWindpowerstationid());
        Optional<String> thingType = Optional.ofNullable(point.getModelid());
        Optional<String> uniformCode = Optional.ofNullable(point.getUniformcode());
        Optional<Long> startTs = Optional.ofNullable(beginDate * 1000);
        Optional<Long> endTs = Optional.ofNullable(endDate * 1000);

//        Calendar cal = Calendar.getInstance();
//        cal.setTime(new Date(startTs.get()));
//        cal.add(Calendar.SECOND, -pried.intValue());
//        startTs= Optional.ofNullable(cal.getTime().getTime());
//        count++;

        //通过时间区间和时间间隔获取点数
        Long finalInterval;
        if (pried != null)
            finalInterval = pried;
        else if (count != null)
            finalInterval = (endDate - beginDate) / count;
        else
            return ErrorRequest.RequestListError(point.getId());
        Optional<Integer> interval = Optional.ofNullable(Integer.parseInt(finalInterval.toString()));

        try {
            String url = baseURL + "/history/stat?null=0";
            //tagName 或thingType，thingId，uniformCode可以确定一个标签点
            if (tagName.isPresent())
                url = url + "&tagName=" + tagName.get();
            else {
                if (thingType.isPresent())
                    url = url + "&thingType=" + thingType.get();
                if (thingId.isPresent())
                    url = url + "&thingId=" + thingId.get();
                if (uniformCode.isPresent())
                    url = url + "&uniformCodes=" + uniformCode.get();
            }
            if (startTs.isPresent())
                url = url + "&startTs=" + startTs.get();
            if (endTs.isPresent())
                url = url + "&endTs=" + endTs.get();
            if (interval.isPresent())
                url = url + "&interval=" + interval.get();

            ResponseEntity<JSONArray> resp = restTemplate.getForEntity(url, JSONArray.class);
            JSONArray jsonArray = resp.getBody();
            if (jsonArray != null)
                return JsonObjectHelper.GeneralTsDataToPointDataByStat(jsonArray, point.getId(), type);
            else {
                return ErrorRequest.RequestListError(point.getId());
            }
        } catch (HttpClientErrorException exception) {
            if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
                //System.out.println("404请求错误");
                return ErrorRequest.RequestListError(point.getId());
            } else {
                throw exception;
            }
        }
    }

    @Override
    public List<PointData> getHistStat(WindPowerStationTestingPoint point, Long beginDate, Long endDate, Long count, Long pried, int type) throws Exception {
        Optional<String> tagName = Optional.ofNullable(point.getCode());
        Optional<String> thingId = Optional.ofNullable(point.getWindpowerstationid());
        Optional<String> thingType = Optional.ofNullable(point.getModelid());
        Optional<String> uniformCode = Optional.ofNullable(point.getUniformcode());
        Optional<Long> startTs = Optional.ofNullable(beginDate * 1000);
        Optional<Long> endTs = Optional.ofNullable(endDate * 1000);
        //通过时间区间和时间间隔获取点数
        Long finalInterval;
        if (pried != null)
            finalInterval = pried;
        else if (count != null)
            finalInterval = (endDate - beginDate) / count;
        else
            return ErrorRequest.RequestListError(point.getCode());
        Optional<Integer> interval = Optional.ofNullable(Integer.parseInt(finalInterval.toString()));

        try {
            String url = baseURL + "/history/stat?null=0";
            //tagName 或thingType，thingId，uniformCode可以确定一个标签点
            if (tagName.isPresent())
                url = url + "&tagName=" + tagName.get();
            else {
                if (thingType.isPresent())
                    url = url + "&thingType=" + thingType.get();
                if (thingId.isPresent())
                    url = url + "&thingId=" + thingId.get();
                if (uniformCode.isPresent())
                    url = url + "&uniformCodes=" + uniformCode.get();
            }
            if (startTs.isPresent())
                url = url + "&startTs=" + startTs.get();
            if (endTs.isPresent())
                url = url + "&endTs=" + endTs.get();
            if (interval.isPresent())
                url = url + "&interval=" + interval.get();

            ResponseEntity<JSONArray> resp = restTemplate.getForEntity(url, JSONArray.class);
            JSONArray jsonArray = resp.getBody();
            if (jsonArray != null)
                return JsonObjectHelper.GeneralTsDataToPointDataByStat(jsonArray, point.getCode(), type);
            else {
                return ErrorRequest.RequestListError(point.getCode());
            }
        } catch (HttpClientErrorException exception) {
            if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
                //System.out.println("404请求错误");
                return ErrorRequest.RequestListError(point.getCode());
            } else {
                throw exception;
            }
        }
    }

    @Override
    public List<PointData> getHistStat(String pointid, Long beginDate, Long endDate, Long count, Long pried, int type) throws Exception {
        Optional<String> tagName = Optional.ofNullable(pointid);
        Optional<Long> startTs = Optional.ofNullable(beginDate * 1000);
        Optional<Long> endTs = Optional.ofNullable(endDate * 1000);
        //通过时间区间和时间间隔获取点数
        Long finalInterval;
        if (count != null)
            finalInterval = (endDate - beginDate) / count;
        else if (pried != null)
            finalInterval = pried;
        else
            return null;
        Optional<Integer> interval = Optional.ofNullable(Integer.parseInt(finalInterval.toString()));
        try {
            String url = baseURL + "/history/stat?null=0";
            //tagName 或thingType，thingId，uniformCode可以确定一个标签点
            if (tagName.isPresent())
                url = url + "&tagName=" + tagName.get();
            if (startTs.isPresent())
                url = url + "&startTs=" + startTs.get();
            if (endTs.isPresent())
                url = url + "&endTs=" + endTs.get();
            if (interval.isPresent())
                url = url + "&interval=" + interval.get();

            ResponseEntity<JSONArray> resp = restTemplate.getForEntity(url, JSONArray.class);
            JSONArray jsonArray = resp.getBody();
            if (jsonArray != null)
                return JsonObjectHelper.GeneralTsDataToPointDataByStat(jsonArray, pointid, type);
            else {
                return ErrorRequest.RequestListError(pointid);
            }
        } catch (HttpClientErrorException exception) {
            if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
                //System.out.println("404请求错误");
                return ErrorRequest.RequestListError(pointid);
            } else {
                throw exception;
            }
        }
    }

    @Override
    public DNAStatVal[] getHistStat(String point, Long beginDate, Long endDate, Integer pried) throws Exception {
        Optional<String> tagName = Optional.ofNullable(point);
        Optional<Long> startTs = Optional.ofNullable(beginDate * 1000);
        Optional<Long> endTs = Optional.ofNullable(endDate * 1000);
        //通过时间区间和时间间隔获取点数
        Optional<Integer> interval = Optional.ofNullable(pried);

        try {
            String url = baseURL + "/history/stat?null=0";
            //tagName 或thingType，thingId，uniformCode可以确定一个标签点
            if (tagName.isPresent())
                url = url + "&tagName=" + tagName.get();
            if (startTs.isPresent())
                url = url + "&startTs=" + startTs.get();
            if (endTs.isPresent())
                url = url + "&endTs=" + endTs.get();
            if (interval.isPresent())
                url = url + "&interval=" + interval.get();

            ////System.out.println(restTemplate.getForEntity(url, JSONArray.class));
            ResponseEntity<JSONArray> resp = restTemplate.getForEntity(url, JSONArray.class);
            if (resp != null) {
                JSONArray jsonArray = resp.getBody();
                if (jsonArray == null || jsonArray.size() <= 0) {
                    DNAStatVal[] dnaVal = new DNAStatVal[1];
                    DNAVal errorData = new DNAVal();
                    errorData.Status = 0;

                    DNAStatVal val = new DNAStatVal();
                    val.avg = errorData;
                    val.max = errorData;
                    val.min = errorData;
                    dnaVal[0] = val;
                    return dnaVal;
                } else {
                    return JsonObjectHelper.phraseDNAVal(jsonArray);
                }
            } else {
                return null;
            }

        } catch (HttpClientErrorException exception) {
            if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
                //System.out.println("404请求错误");
                DNAStatVal val = new DNAStatVal();
                DNAStatVal[] dnaVal = new DNAStatVal[1];
                DNAVal errorData = new DNAVal();
                errorData.Status = 0;
                val.avg = errorData;
                val.max = errorData;
                val.min = errorData;
                dnaVal[0] = val;
                return dnaVal;

            } else {
                DNAStatVal val = new DNAStatVal();
                DNAStatVal[] dnaVal = new DNAStatVal[1];
                DNAVal errorData = new DNAVal();
                errorData.Status = 0;
                val.avg = errorData;
                val.max = errorData;
                val.min = errorData;
                dnaVal[0] = val;
                return dnaVal;
            }
        }
    }

    private JSONObject convertPointData(PointData pd) {
        JSONObject jo = new JSONObject();
        jo.put("tagName", pd.getEdnaId());
        JSONObject joo = new JSONObject();
        joo.put("ts", pd.getPointTime()*1000);
        joo.put("status", 0);
        joo.put("doubleValue", pd.getPointValueInDouble());
        jo.put("tsData", joo);
        return jo;
    }

    @Override
    public void updatePoint(PointData point) throws Exception {
        String url = baseURL + "/history";
        try {
            String result = restTemplate.postForObject(url, convertPointData(point), String.class);
        } catch (HttpClientErrorException exception) {
            if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
                return;
            } else {
                throw exception;
            }
        }
    }

    @Override
    public DNAVal[] getRealtimeTagValues(String... tagNames) throws Exception {
        String pointIdString = StringUtil.join(tagNames, ",");
        Optional<String> keys = Optional.ofNullable(pointIdString);
        String url = baseURL + "/latest?null=0";
        try {
            if (keys.isPresent())
                url = url + "&keys=" + keys.get();
            else
                return null;

            ResponseEntity<JSONObject> resp = restTemplate.getForEntity(url, JSONObject.class);
            JSONObject jsonObject = resp.getBody();
            if (StringUtils.isNotEmpty(jsonObject) && !jsonObject.isEmpty()){
                return JsonObjectHelper.phraseDNAVal(jsonObject,tagNames);
            } else {
                DNAVal[] errorResult = new DNAVal[tagNames.length];
                for(int i=0;i<tagNames.length;i++)
                {
                    DNAVal val = new DNAVal();
                    val.Status = 0;
                    errorResult[i] = val;
                }
                return errorResult;
            }

        } catch (HttpClientErrorException exception) {
            if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
                //System.out.println("404请求错误");
                DNAVal[] errorResult = new DNAVal[tagNames.length];
                for(int i=0;i<tagNames.length;i++)
                {
                    DNAVal val = new DNAVal();
                    val.Status = 0;
                    errorResult[i] = val;
                }
                return errorResult;
            } else {
                throw exception;
            }
        }
    }

    @Override
    public void updatePoint(List<PointData> pointls) throws Exception {
        String url = baseURL + "/history/batch";
        List<JSONObject> writeList = new ArrayList<>();

        for (PointData entity : pointls) {
            writeList.add(convertPointData(entity));
        }
        try {
            String result = restTemplate.postForObject(url, writeList, String.class);
        } catch (HttpClientErrorException exception) {
            if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
                return;
            } else {
                throw exception;
            }
        }
    }

//    @Override
//    public void sendSinglePoint(PointData point) throws Exception {
//        String url = baseURL + "/latest";
//
//
//        try {
//            String result = restTemplate.postForObject(url, convertPointData(point), String.class);
//        } catch (HttpClientErrorException exception) {
//            if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
//                return;
//            } else {
//                throw exception;
//            }
//        }
//    }
//
//    @Override
//    public void sendMultiPoint(List<PointData> pointls) throws Exception {
//
//        String url = baseURL + "/latest/batch";
//        List<JSONObject> writeList = new ArrayList<>();
//
//        for (PointData entity : pointls) {
//            writeList.add(convertPointData(entity));
//        }
//        try {
//            String result = restTemplate.postForObject(url, writeList, String.class);
//        } catch (HttpClientErrorException exception) {
//            if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
//                //System.out.println("404请求错误");
//            } else {
//                throw exception;
//            }
//        }
//    }
//
//    @Override
//    public void sendMultiPoint(String[] realvalue, DNAVal[] pointls) throws Exception {
//        String url = baseURL + "/latest/batch";
//
//        List<JSONObject> writeDataList = new ArrayList<>();
//        if (realvalue != null && pointls != null & realvalue.length == pointls.length) {
//            for (int i = 0; i < realvalue.length; i++) {
//                PointData writeData = new PointData();
//                writeData.setEdnaId(realvalue[i]);
//                writeData.setPointValueInDouble(pointls[i].DValue);
//                writeData.setPointTime((long)pointls[i].Time);
//                JSONObject jsonObject=convertPointData(writeData);
//                writeDataList.add(jsonObject);
//            }
//
//            try {
//                String result = restTemplate.postForObject(url, writeDataList, String.class);
//            } catch (HttpClientErrorException exception) {
//                if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
//                    //System.out.println("404请求错误");
//                } else {
//                    throw exception;
//                }
//            }
//        } else
//            return;
//    }

    //多点切面数据
    @Override
    public DNAVal[] getHistMatrix(String[] nameList, long tTime) throws Exception {
        String tagNameString = StringUtil.join(nameList, ",");
        Long time = Long.valueOf(tTime);
        Optional<String> tagName = Optional.ofNullable(tagNameString);
        Optional<Long> ts = Optional.ofNullable(time * 1000);
        String url = baseURL + "/history/section?tagNames=" + tagName.get() + "&ts=" + ts.get();
        try {
            ResponseEntity<JSONObject> resp = restTemplate.getForEntity(url, JSONObject.class);
            JSONObject jsonObject = resp.getBody();
            if (StringUtils.isNotEmpty(jsonObject) && !jsonObject.isEmpty())
            {
                return JsonObjectHelper.phraseDNAVal(jsonObject,nameList);
            }
            else {
                DNAVal[] errorResult = new DNAVal[nameList.length];
                for(int i=0;i<nameList.length;i++)
                {
                    DNAVal val = new DNAVal();
                    val.Status = 0;
                    errorResult[i] = val;
                }
                return errorResult;
            }
        } catch (Exception e) {
            DNAVal[] errorResult = new DNAVal[nameList.length];
            for(int i=0;i<nameList.length;i++)
            {
                DNAVal val = new DNAVal();
                val.Status = 0;
                errorResult[i] = val;
            }
            return errorResult;
        }
    }


}
