package com.casic.service.impl;

import com.alibaba.druid.util.StringUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.casic.dao.DataPressureMapper;
import com.casic.model.AlarmPushConfig;
import com.casic.model.DataPressure;
import com.casic.model.PressureDataParam;
import com.casic.model.ResponseData;
import com.casic.service.AlarmPushService;
import com.casic.service.MessagePusherService;
import com.casic.service.ThirdDataService;
import com.casic.util.SendBatchSmsUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Service;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;

@Service
@Slf4j
public class ThirdDataServiceImpl extends ServiceImpl<DataPressureMapper, DataPressure> implements ThirdDataService {

    private final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA);

    @Autowired
    private AlarmPushService alarmPushService;

    @Autowired
    private MessagePusherService messagePusherService;

    @Autowired
    private SendBatchSmsUtil sendBatchSmsUtil;


    @Override
    public Object getDeviceRecentData(PressureDataParam pressureDataParam) {
        ResponseData responseData = new ResponseData();
        try {
            batchSave(pressureDataParam);
            responseData.setMessage(ResponseData.DEFAULT_SUCCESS_MESSAGE);
            responseData.setCode(ResponseData.DEFAULT_SUCCESS_CODE);
        } catch (DataAccessException dae) {
            log.error("设备最近数据查询异常，设备类型{}，异常信息{}", dae.getMessage());
            responseData.setMessage(ResponseData.DEFAULT_ERROR_MESSAGE);
            responseData.setCode(ResponseData.DEFAULT_ERROR_CODE);
        }
        return responseData;
    }

    private void batchSave(PressureDataParam pressureDataParam) {
        String pressureDataJson = pressureDataParam.getRawData();
        log.info("----" + pressureDataJson);
        Map<String, Object> pressureDataMap = JSON.parseObject(pressureDataJson, HashMap.class);
        Date uptime = null;
        try {
            uptime = dateFormat.parse(String.valueOf(pressureDataMap.get("times")));
        } catch (Exception e) {
            log.error("主题，采集时间解析异常，异常信息{}", e.getMessage());
        }
        List<Map<String, String>> pressureDataList = (List<Map<String, String>>) pressureDataMap.get("sensorDatas");
        DataPressure dataPressure = initPrssureData(pressureDataList, uptime);
        if (dataPressure == null) {
            return;
        }
        checkAlarm(dataPressure);
    }

    private DataPressure initPrssureData(List<Map<String, String>> pressureDataList, Date uptime) {
        DataPressure dataPressure = new DataPressure();
        String devcode = pressureDataList.get(pressureDataList.size() - 1).get("str");
        Map<String, String> pressureDataMap = pressureDataList.stream().collect(
                Collectors.toMap(e -> String.valueOf(e.get("flag")), e -> String.valueOf(e.get("value")))
        );
//        if (CacheUtil.serialBuf.get(devcode)!=null&&CacheUtil.serialBuf.get(devcode).equals(pressureDataMap.get("F"))) {
//            return null;
//        }
        String wellCode = this.baseMapper.getWellCode(devcode);
        dataPressure.setWellCode(wellCode);
        dataPressure.setDevcode(devcode);
        dataPressure.setPci(pressureDataMap.get("Q"));
        dataPressure.setCell(Float.valueOf(pressureDataMap.get("V")));
        dataPressure.setTemperature(pressureDataMap.get("T"));
        dataPressure.setPress(pressureDataMap.get("F"));
        dataPressure.setUptime(dateFormat.format(uptime));
        dataPressure.setLogtime(dateFormat.format(new Date()));
        this.baseMapper.insert(dataPressure);
//        CacheUtil.serialBuf.put(devcode, pressureDataMap.get("F"));
        return dataPressure;
    }

    private void checkAlarm(DataPressure dataPressure) {
        final Float ruleValue = this.baseMapper.getRuleValue("24");
        if (ruleValue == null) {
            return;
        }
        if (!StringUtils.isEmpty(dataPressure.getPress()) && !dataPressure.getPress().equals("null")) {
            if (Float.valueOf(dataPressure.getPress()) > ruleValue) {
                this.baseMapper.saveRecords(dataPressure.getPress(), new Date());
                alarmPushBuilder(dataPressure.getDevcode(), dataPressure.getPress());
            }
        }
    }
    // "在2023年1月12号 16时43分23秒,设备41232561发生了压力超标/浓度超限,数值为20"
    //                        + "设备" + devcode + "发生了压力超标，压力值为" + presss
    //

    private void alarmPushBuilder(String devcode, String presss) {
        ResponseData responseData = (ResponseData) alarmPushService.getAlarmPush("H2S");
        AlarmPushConfig alarmPushConfig = (AlarmPushConfig) responseData.getData();
        if (alarmPushConfig.getEnable().equals(1)) {
            if (alarmPushConfig.getWebsocketAlarm().equals(1)) {
                String msg = "在" + new SimpleDateFormat("yyyyMMdd HH:mm:ss").format(new Date()) + ","
                        + "设备" + devcode + "发生了压力超标，压力值为" + presss;
                try {
                    messagePusherService.updateSinkJob("", URLDecoder.decode(msg, "UTF-8"));
                } catch (UnsupportedEncodingException uee) {
                    log.error("websocket推送，内容转码出现异常,异常信息为{}", uee.getMessage());
                }
            }
            if (alarmPushConfig.getShortMessageAlarm().equals(1)) {
                Map<String, String> msgMap = new HashMap<>();
                msgMap.put("time", new SimpleDateFormat("yyyyMMdd HH:mm:ss").format(new Date()));
                msgMap.put("devcode", devcode);
                msgMap.put("value", presss);
                msgMap.put("content", "压力超标");
                String phoneJson = "";
                if (StringUtils.isEmpty(alarmPushConfig.getPhoneArray())) {
                    String[] phones = alarmPushConfig.getPhoneArray().split(",");
                    List<String> phoneList = new ArrayList<>();
                    for (String phone : phones) {
                        phoneList.add(phone);
                    }
                    phoneJson = JSONObject.toJSONString(phoneList);
                }
                sendBatchSmsUtil.sendMsg(phoneJson, JSON.toJSONString(msgMap));
            }
        }
    }


}
