package org.ts.ddcs.Worker;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.ts.ddcs.DataItemTemplate.DataItemTemplateInterface;
import org.ts.ddcs.DataTemplate.DataTemplateLine;
import org.ts.ddcs.DataTemplate.DataTemplateManager;
import org.ts.ddcs.DataTemplate.TemplateLineNode;
import org.ts.ddcs.Entity.RtuBaseInfo;
import org.ts.ddcs.log.LogHelper;
import org.ts.ddcs.Tool.BytesHelp;
import org.ts.ddcs.utils.GBConstants;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.Callable;

@SuppressWarnings("all")
public class DataGramDtu2021Process implements Callable<Integer> {

    private String _msg;
    private HashMap<String, DataItemTemplateInterface> dataItem;

    DataGramDtu2021Process(String msg) {
        this._msg = msg;
    }

    @Override
    public Integer call() {
//        try {
//            LogHelper.info("DataGramSzy2012Process " + this._msg);
//            JSONObject body = JSONObject.parseObject(this._msg);
//            if (body.containsKey(GBConstants.BASE_KEY_DATAGRAM)) {
//                RedisTemplate redisTemplate = DataProcessHolder.newInstance().dataProcess.redisTemplate;
//                HashOperations<String, String, String> opsHash = redisTemplate.opsForHash();
//
//                String datagram = body.getString(GBConstants.BASE_KEY_DATAGRAM);
//                String rtuCode = body.getString(GBConstants.BASE_KEY_RTU);
//                byte[] data_gram_buff = BytesHelp.hexStr2Bytes(datagram);
//                SimpleDateFormat timeFormat = new SimpleDateFormat("yyyyMMddHHmmss");
//                SimpleDateFormat timeFormat2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//                Date pickDt = timeFormat.parse(body.getString(GBConstants.BASE_KEY_DATAGRAM_PICK_TM));//接收时间
//
//                /**自动创建测站**/
//                RtuBaseInfo rtuBaseInfo = new RtuBaseInfo();
//                rtuBaseInfo.setRtuCode(rtuCode);
//                if (opsHash.hasKey(rtuCode, GBConstants.REDIS_KEY_PROJECT_ID)) {
//                    String projectId = opsHash.get(rtuCode, GBConstants.REDIS_KEY_PROJECT_ID);
//                    if (opsHash.hasKey(GBConstants.REDIS_KEY_PROJECT_PREFIX + projectId, GBConstants.REDIS_KEY_PROJECT_INFO_RTUCODEAGREEMENT)) {
//                        String rtuCodeAgreement = opsHash.get(GBConstants.REDIS_KEY_PROJECT_PREFIX + projectId, GBConstants.REDIS_KEY_PROJECT_INFO_RTUCODEAGREEMENT);
//                        if (null != rtuCodeAgreement) {
//                            if (rtuCodeAgreement.equals(GBConstants.RTU_CODE_AGREEMENT_1)) {//低位在前
//                                String rtutail = rtuCode.substring(8, 10) + rtuCode.substring(6, 8);
//                                byte[] rtubuff = BytesHelp.hexStr2Bytes(rtutail);
//                                int rtuvalue = BytesHelp.bytes2short(rtubuff);
//                                if (rtuvalue >= 0 && rtuvalue <= 9999) {
//                                    rtutail = String.format("%04d", rtuvalue);
//                                    String newkey = rtuCode.substring(0, 6) + rtutail;
//                                    rtuBaseInfo.setRtuCode2( newkey);
//                                }
//                            } else if (rtuCodeAgreement.equals(GBConstants.RTU_CODE_AGREEMENT_2)) {//高位在前
//                                String rtutail = rtuCode.substring(6, 10);
//                                byte[] rtubuff = BytesHelp.hexStr2Bytes(rtutail);
//                                int rtuvalue = BytesHelp.bytes2short(rtubuff);
//                                if (rtuvalue >= 0 && rtuvalue <= 9999) {
//                                    rtutail = String.format("%04d", rtuvalue);
//                                    String newkey = rtuCode.substring(0, 6) + rtutail;
//                                    rtuBaseInfo.setRtuCode2( newkey);
//                                }
//                            }
//                        }
//                    }
//                }
//
//                DataProcessHolder.newInstance().dataProcess.rtuService.saveOrUpdateRtu(rtuBaseInfo);
//
//                DataTemplateLine line = DataTemplateManager.newInstance().getTemplateLine();
//                line.Stream(data_gram_buff);
//                TemplateLineNode macth = line.MacthTemplate();
//                if (null != macth) {
//                    String pickTm = body.getString(GBConstants.BASE_KEY_DATAGRAM_PICK_TM);
//                    Date collectTime = null;
//                    byte[] dtbuff = macth._DataTemplate.SendPacketTime();
//                    if (null != dtbuff && dtbuff.length > 0) {
//                        String dt = BytesHelp.byte2HexStr(dtbuff);
//                        dt = pickTm.substring(0, 2) + dt;
//                        collectTime = timeFormat.parse(dt);
//                    }
//
//                    /**指令执行完成**/
//                    if (macth._DataTemplate.ClearCommand()) {
//                        DataProcess.CommandComplete(rtuCode, BytesHelp.byte2HexStr(macth._DataTemplate.FuncCode()));
//                    }
//
//                    opsHash.put(rtuCode, "lastTime", timeFormat2.format(pickDt));
//                    opsHash.put(rtuCode, GBConstants.REDIS_KEY_RTU_SPACE_TIME, "0");
//
//                    /**数据入库处理*/
//                    if (DataProcess.config().isDataBaseSave()) {
//                        DataProcessHolder.newInstance().dataProcess.SubmitDataSaveTask(macth);
//                    }
//
//                    String func = macth._DataTemplate.GetFeture();
//
//                    /**报文转发处理*/
//                    if (DataProcess.config().isRelayRemote()) {
//                        if (func.equals("C0")) {
//                            if (opsHash.hasKey(rtuCode, "relay")) {
//                                String isRelay = opsHash.get(rtuCode, "relay");
//                                if (null != isRelay && isRelay.equals("1")) {
//                                    if (opsHash.hasKey(rtuCode, "relayIp")) {
//                                        String relayIp = opsHash.get(rtuCode, "relayIp");
//                                        if (null != relayIp && relayIp.length() > 0) {
//                                            if (rtuCode.equals("1522001A00") || rtuCode.equals("1522002700")) {
//                                                DataProcessHolder.newInstance().dataProcess.SubmitXamSzy2012DataGramRelayTask(rtuCode, collectTime, pickDt, relayIp, datagram);
//                                            } else if (rtuCode.equals("0020160011")) {
//                                                DataProcessHolder.newInstance().dataProcess.SubmitDlSzy2012DataGramRelayTask(rtuCode, collectTime, pickDt, relayIp, datagram);
//                                            } else {
//                                                DataProcessHolder.newInstance().dataProcess.SubmitSzy2012DataGramRelayTask(rtuCode, collectTime, pickDt, relayIp, datagram);
//                                            }
//
//
//                                        }
//                                    }
//                                }
//                            }
//                        }
//                    }
//                    /**
//                     * 转发报文到管理后台系统
//                     */
//                    if (DataProcess.config().isRelayToTaishan()) {
//                        String dataInfo = macth._DataTemplate.getDataInfo();
//                        if (null != dataInfo) {
//                            JSONObject dataInfoBody = JSONObject.parseObject(dataInfo);
//                            DataProcessHolder.newInstance().dataProcess.SubmitRelayManageTask(rtuCode, dataInfoBody);
//                        }
//                    }
//
//                    /**计算主连接服务器优先度**/
//                    if (DataProcess.config().isConnectManage()) {
//                        String serverId = body.getString(GBConstants.BASE_KEY_COLLECT_SERVER);
//                        DataProcessHolder.newInstance().dataProcess.SubmitConnectManageTask(rtuCode, serverId, new Date());
//                    }
//
//
//                    if (func.equals("F5")) {
//                        opsHash.put(rtuCode, GBConstants.REDIS_KEY_RTU_STATUS_DATAGRAM, datagram);
//                    }
//
//                    /**检查RTU设备状态*/
//                    if (DataProcess.config().isRtuStatusCheck()) {
//                        if (func.equals("C0")) {
//                            DataProcessHolder.newInstance().dataProcess.SubmitRtuStatusNotifyTask(pickDt, macth, datagram);
//                        }
//                        if (func.equals("F5")) {
//                            DataProcessHolder.newInstance().dataProcess.SubmitRtuStatusNotifyTask(pickDt, macth, datagram);
//                        }
//                    }
//
//                    /**通知指令下行**/
//                    DataProcess.DownloadNotify(rtuCode);
//
//                    /**
//                     * 检查是否有数据异常
//                     */
//                    if (func.equals("C0")) {
//                        if (macth._DataTemplate.NeedCheckOutlierData()) {
//                            List<DataItemTemplateInterface> OutlierData = macth._DataTemplate.OutlierData();
//                            if (null != OutlierData && OutlierData.size() > 0) {
//                                JSONObject warningInfoBody = new JSONObject();
//                                warningInfoBody.put(GBConstants.BASE_KEY_WARNING_CHECK_TIME, timeFormat2.format(new Date()));
//                                warningInfoBody.put(GBConstants.BASE_KEY_AGREEMENT, GBConstants.AGREEMENT_KIND_SZY);
//                                warningInfoBody.put(GBConstants.BASE_KEY_RTU, rtuCode);
//                                warningInfoBody.put(GBConstants.BASE_KEY_DATAGRAM, datagram);
//                                warningInfoBody.put(GBConstants.BASE_KEY_WARNING_KIND, GBConstants.WARNING_TYPE_OUTLIER_DATA);
//                                warningInfoBody.put(GBConstants.BASE_KEY_WARNING_INFO, "数据异常");
//                                JSONObject warningContent = new JSONObject();
//                                JSONArray outlierdataContent = new JSONArray();
//                                for (DataItemTemplateInterface itemTemplateInterface : OutlierData) {
//                                    JSONObject errorData = new JSONObject();
//                                    byte[] valueBuff = itemTemplateInterface.GetByteArray();
//                                    String hexValue = BytesHelp.byte2HexStr(valueBuff);
//                                    errorData.put("value", hexValue);
//                                    errorData.put("desc", itemTemplateInterface.GetDesc());
//                                    errorData.put("afn", itemTemplateInterface.GetFeture());
//                                    outlierdataContent.add(errorData);
//                                }
//                                warningContent.put("data", outlierdataContent);
//                                warningInfoBody.put(GBConstants.BASE_KEY_WARNING_CONTENT, warningContent.toJSONString());
//                                warningInfoBody.put(GBConstants.BASE_KEY_WARNING_STATUS, GBConstants.WARNING_STATUS_HAPPEN);
//                                String queue = DataProcessHolder.newInstance().dataProcess.queueConfig.getWarningMessage();
//                                DataProcessHolder.newInstance().dataProcess.kafkaTemplate.send(queue, warningInfoBody.toJSONString());
//
//                            } else {
//                                //判断是否已预警
//                                if (opsHash.hasKey(rtuCode, "warning_" + GBConstants.WARNING_TYPE_OUTLIER_DATA)) {
//                                    String warning = opsHash.get(rtuCode, "warning_" + GBConstants.WARNING_TYPE_OUTLIER_DATA);
//                                    if (null != warning && warning.equals(GBConstants.WARNING_STATUS_HAPPEN)) {
//                                        JSONObject warningInfoBody = new JSONObject();
//                                        warningInfoBody.put(GBConstants.BASE_KEY_WARNING_CHECK_TIME, timeFormat2.format(new Date()));
//                                        warningInfoBody.put(GBConstants.BASE_KEY_AGREEMENT, GBConstants.AGREEMENT_KIND_SZY);
//                                        warningInfoBody.put(GBConstants.BASE_KEY_RTU, rtuCode);
//                                        warningInfoBody.put(GBConstants.BASE_KEY_DATAGRAM, datagram);
//                                        warningInfoBody.put(GBConstants.BASE_KEY_WARNING_KIND, GBConstants.WARNING_TYPE_OUTLIER_DATA);
//                                        warningInfoBody.put(GBConstants.BASE_KEY_WARNING_INFO, "数据异常错误已恢复");
//                                        warningInfoBody.put(GBConstants.BASE_KEY_WARNING_STATUS, GBConstants.WARNING_STATUS_RECOVERY);
//                                        String queue = DataProcessHolder.newInstance().dataProcess.queueConfig.getWarningMessage();
//                                        DataProcessHolder.newInstance().dataProcess.kafkaTemplate.send(queue, warningInfoBody.toJSONString());
//
//                                    }
//                                }
//                            }
//                        }
//                    }
//                    /**
//                     * 检查是否有CRC校验错误
//                     */
//                    if (opsHash.hasKey(rtuCode, "warning_" + GBConstants.WARNING_TYPE_CRC_ERROR)) {
//                        String warning = opsHash.get(rtuCode, "warning_" + GBConstants.WARNING_TYPE_CRC_ERROR);
//                        if (null != warning && warning.equals(GBConstants.WARNING_STATUS_HAPPEN)) {
//                            JSONObject warningInfoBody = new JSONObject();
//                            warningInfoBody.put(GBConstants.BASE_KEY_WARNING_CHECK_TIME, timeFormat2.format(new Date()));
//                            warningInfoBody.put(GBConstants.BASE_KEY_AGREEMENT, GBConstants.AGREEMENT_KIND_SZY);
//                            warningInfoBody.put(GBConstants.BASE_KEY_RTU, rtuCode);
//                            warningInfoBody.put(GBConstants.BASE_KEY_DATAGRAM, datagram);
//                            warningInfoBody.put(GBConstants.BASE_KEY_WARNING_KIND, GBConstants.WARNING_TYPE_CRC_ERROR);
//                            warningInfoBody.put(GBConstants.BASE_KEY_WARNING_INFO, "CRC校验错误已恢复");
//                            warningInfoBody.put(GBConstants.BASE_KEY_WARNING_STATUS, GBConstants.WARNING_STATUS_RECOVERY);
//                            String queue = DataProcessHolder.newInstance().dataProcess.queueConfig.getWarningMessage();
//                            DataProcessHolder.newInstance().dataProcess.kafkaTemplate.send(queue, warningInfoBody.toJSONString());
//                            //  opsHash.put(rtuCode, "warning_" + GBConstants.WARNING_TYPE_CRC_ERROR, GBConstants.WARNING_STATUS_RECOVERY);
//                        }
//                    }
//                    /**
//                     * 发送报文到后台运维日志分析
//                     */
//                    if (DataProcessHolder.newInstance().dataProcess.config.isRelayToLog()) {
//                        JSONObject jsonLog = new JSONObject();
//                        jsonLog.put("logTime", timeFormat2.format(pickDt));
//                        jsonLog.put("datagram", datagram);
//                        jsonLog.put("agreement", GBConstants.AGREEMENT_KIND_SZY);
//                        jsonLog.put("rtu", rtuCode);
//                        String mq_log = DataProcessHolder.newInstance().dataProcess.queueConfig.getLogMessage();
//                        DataProcessHolder.newInstance().dataProcess.kafkaTemplate.send(mq_log, jsonLog.toJSONString());
//                    }
//                }
//            }
//        } catch (Exception e) {
//            LogHelper.error(e);
//        }
        return 0;
    }
}
