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.WindPowerStationTestingPoint2;
import com.gyee.frame.model.auto.WindTurbineTestingPointAi2;
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();
    
     String baseURL = V2Config.getBaseurl();

    @Override
    public PointData getRealData(WindPowerStationTestingPoint2 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(WindPowerStationTestingPoint2 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(WindPowerStationTestingPoint2 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(WindTurbineTestingPointAi2 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(WindTurbineTestingPointAi2 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(WindTurbineTestingPointAi2 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));
                   // //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");
                    }
                    pointData.setPointValue(pointValue);
                    pointData.setPointValueInDouble(Double.parseDouble(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(WindTurbineTestingPointAi2 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(WindPowerStationTestingPoint2 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, int 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;
        }
    }


}
