package com.fjhx.listener;

import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.fjhx.constants.WebSocketConstant;
import com.fjhx.entity.MessageEntity;
import com.fjhx.event.WebSocketOnMessageEvent;
import com.fjhx.event.WebSocketOnOpenEvent;
import com.fjhx.service.WebSocketServer;
import com.fjhx.service.check.impl.CheckInfoServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class WebSocketEventListener {

//    @Resource
//    private RabbitTemplate rabbitTemplate;

//    private RabbitTemplate.ConfirmCallback confirmCallback;


    @EventListener
    public void onMessageListener(WebSocketOnOpenEvent event) {
        WebSocketServer source = event.getSource();
        JSONObject jsonObject = new JSONObject();
        source.sendMessage(WebSocketConstant.ON_OPEN_TYPE, jsonObject);
    }


    @EventListener
    public void onMessageListener(WebSocketOnMessageEvent event) {
        WebSocketServer webSocketServer = event.getSource();
        String message = event.getMessage();

        System.err.println(message);

        MessageEntity sendEntity = JSONObject.parseObject(message, MessageEntity.class);

        Integer type = sendEntity.getType();
        JSONObject data = sendEntity.getData();

        switch (type) {
            case WebSocketConstant.OPERATING_UPPER_COMPUTER:

                data.put(WebSocketConstant.FORWARD_USER_ID, webSocketServer.getUserId());
                data.put(WebSocketConstant.FORWARD_SESSION_ID, webSocketServer.getSessionId());

                WebSocketServer.sendInfo(WebSocketConstant.WEB_STOCK_PROGRAM, type, data);
                break;

            case WebSocketConstant.PUSH_RFID:

                if (ObjectUtil.equals(data.get("flag"), "automaticCheck")) {
                    CheckInfoServiceImpl.RFID_LIST.add(data.getString("rfid"));
                } else {
                    WebSocketServer.sendInfo(sendEntity.getUserId(), sendEntity.getSessionId(), type, data);
                }
                break;

        }

    }


//    /**
//     * 一体机rfid扫描
//     */
//    private void handheldMachineRfidScanning(JSONObject data, String userId, Integer instructType) {
//        Integer plcCode = data.getInteger("plcCode");
//        Integer door = data.getInteger("door");
//        Integer inOut = data.getInteger("inOut");
//
//        JSONObject sendData = new JSONObject();
//        List<String> ips = new ArrayList<>();
//
//        // 赋值ip地址
//        if (plcCode == 1 && door == 1 && inOut == 1) {
//            ips.add("192.168.5.11");
//        } else if (plcCode == 1 && door == 1 && inOut == 2) {
//            ips.add("192.168.5.16");
//        } else if (plcCode == 1 && door == 2 && inOut == 1) {
//            ips.add("192.168.5.15");
//        } else if (plcCode == 2 && door == 1 && inOut == 1) {
//            ips.add("192.168.5.41");
//        } else if (plcCode == 2 && door == 2 && inOut == 2) {
//            ips.add("192.168.5.42");
//        } else {
//            return;
//        }
//
//        sendData.put("ips", ips);
//        sendData.put("userId", userId);
//        sendData.put("busUuid", userId);
//        sendData.put("instructType", instructType);
//
//        // 封装消息
//        Message message = MessageBuilder.withBody(sendData.toJSONString().getBytes())
//                .setContentType(MessageProperties.CONTENT_TYPE_JSON)
//                .setContentEncoding("UTF-8")
//                .build();
//
//        sendRabbit(message, 0);
//    }


//    /**
//     * 发送消息到rabbitMq
//     *
//     * @param message 消息体
//     * @param i       重试次数
//     */
//    private void sendRabbit(Message message, int i) {
//        int j = ++i;
//
//        // 发送消息
//        this.rabbitTemplate.setMandatory(true);
//        this.rabbitTemplate.setConfirmCallback(getConfirmCallback(j, message));
//        this.rabbitTemplate.convertAndSend(RabbitConstant.RFID_EXCHANGE, RabbitConstant.INSTRUCTIONS_ROUTING_KEY,
//                message, new CorrelationData(IdWorker.getIdStr()));
//    }
//
//    /**
//     * 获取回调方法
//     */
//    private synchronized RabbitTemplate.ConfirmCallback getConfirmCallback(int j, Message message) {
//
//        if (confirmCallback == null) {
//            confirmCallback = (CorrelationData correlationData, boolean ack, String cause) -> {
//                // 重试机制
//                if (!ack) {
//                    if (j < 3) {
//                        ThreadUtil.sleep(j * 300L);
//                        sendRabbit(message, j);
//                        log.error("rabbitMqCallback：一体机开启出入库rfid扫描消息推送重试，次数：" + j);
//                    } else {
//                        log.error("rabbitMqCallback：一体机开启出入库rfid扫描消息推送失败");
//                    }
//                } else {
//                    log.info("rabbitMqCallback：success");
//                }
//            };
//        }
//
//        return confirmCallback;
//    }


}
