package com.mortals.xhx.common.utils;

import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson.JSON;
import com.mortals.xhx.base.system.message.impl.MessageProducer;
import com.mortals.xhx.busiz.req.DeviceMsgReq;
import com.mortals.xhx.common.code.LogTypeEnum;
import com.mortals.xhx.common.key.Constant;
import com.mortals.xhx.common.key.QueueKey;
import com.mortals.xhx.common.model.DefaultTbQueueMsgHeaders;
import com.mortals.xhx.common.model.MessageHeader;
import com.mortals.xhx.module.device.model.DeviceEntity;
import com.mortals.xhx.module.device.model.DeviceLogEntity;
import com.mortals.xhx.module.device.service.DeviceLogService;
import com.mortals.xhx.module.device.service.DeviceService;
import com.mortals.xhx.module.platform.service.PlatformService;
import com.mortals.xhx.module.product.service.ProductService;
import com.mortals.xhx.queue.DefaultTbQueueMsg;
import com.mortals.xhx.queue.TbQueueMsg;
import com.mortals.xhx.queue.TbQueueMsgHeaders;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.ObjectUtils;

import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

/**
 * 接收消息
 *
 * @author: zxfei
 * @date: 2022/4/28 10:56
 * @description:
 **/
@Slf4j
@AllArgsConstructor
public class DownMsgTask implements Runnable {
    private List<DeviceMsgReq> list;
    private PlatformService platformService;
    private ProductService productService;
    private DeviceService deviceService;
    private DeviceLogService deviceLogService;
    private MessageProducer messageProducer;

    @Override
    public void run() {
        try {
            List<DeviceMsgReq> collect = list.stream().sorted(Comparator.comparing(DeviceMsgReq::getTimestamp)).collect(Collectors.toList());
            List<List<DeviceMsgReq>> partition = ListUtil.partition(collect, 10);
            for (List<DeviceMsgReq> deviceMsgReqs : partition) {
                for (DeviceMsgReq item : deviceMsgReqs) {
                    //根据设备编码查询设备
                    DeviceEntity deviceEntity = null;
                    try {
                        deviceEntity = deviceService.getExtCache(item.getDeviceCode());
                    } catch (Exception e) {
                        log.info("deviceCode:{}", item.getDeviceCode());
                        log.error("redis 获取设备异常！", e);
                        continue;
                    }
                    if (!ObjectUtils.isEmpty(deviceEntity)) {
                        TbQueueMsgHeaders header = new DefaultTbQueueMsgHeaders();
                        header.put(MessageHeader.MESSAGETYPE, item.getMessageType());
                        header.put(MessageHeader.DEVICECODE, item.getDeviceCode());
                        header.put(MessageHeader.TIMESTAMP, item.getTimestamp().toString());

                        TbQueueMsg queueMsg = new DefaultTbQueueMsg(IdUtil.fastUUID(), item.getData(), header);
                        messageProducer.sendMsg(QueueKey.DEFAULT_EXCHANGE, Constant.DOWN_TOPIC + deviceEntity.getDeviceCode(), JSON.toJSONString(queueMsg));

                        DeviceLogEntity deviceLogEntity = new DeviceLogEntity();
                        deviceLogEntity.initAttrValue();
                        deviceLogEntity.setTraceID(IdUtil.fastSimpleUUID());
                        deviceLogEntity.setSiteId(deviceEntity.getSiteId());
                        deviceLogEntity.setDeviceId(deviceEntity.getId());
                        deviceLogEntity.setDeviceName(deviceEntity.getDeviceName());
                        deviceLogEntity.setDeviceCode(deviceEntity.getDeviceCode());
                        deviceLogEntity.setMessageHead(item.getMessageType());
                        deviceLogEntity.setContent(item.getData());
                        deviceLogEntity.setLogType(LogTypeEnum.下发服务.getValue());
                        deviceLogEntity.setCreateUserId(1L);
                        deviceLogEntity.setCreateTime(new Date());
                        deviceLogService.save(deviceLogEntity, null);
                    } else {
                        log.info("未找到设备，deviceCode:{}", item.getDeviceCode());
                    }
                }

                TimeUnit.SECONDS.sleep(1);
            }

        } catch (Exception e) {
            log.error("异常：", e);
        }
    }
}
