package com.qmdx00.onenet.mq;

import com.google.protobuf.InvalidProtocolBufferException;
import com.qmdx00.onenet.mq.handler.MessageHandler;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.IMqttAsyncClient;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author yuanweimin
 * @date 19/06/12 18:07
 * @description 消息接收
 */
@SuppressWarnings("unused")
@Slf4j
public class PushCallback implements MqttCallback {
    private ExecutorService service = Executors.newCachedThreadPool();
    private IMqttAsyncClient Client;
    private MessageHandler handler;
    private MqClient mqClient;
    private int reConnTimes = 0;

    PushCallback(MqClient mqClient, MessageHandler handler) {
        this.mqClient = mqClient;
        this.handler = handler;
    }

    @Override
    public void connectionLost(Throwable cause) {
        log.info("connect is lost,and try to reconnect");
        while (!mqClient.reConnect()) {
            try {
                if (reConnTimes++ > 20) {//前20次每秒重连一次
                    Thread.sleep(1000);
                } else {//超过20次后每10s重连一次
                    Thread.sleep(10000);
                }
            } catch (InterruptedException e) {
                log.error("{}", e.getMessage());
            }
        }
    }

    @Override
    public void messageArrived(String topic, MqttMessage message) throws InvalidProtocolBufferException {
        byte[] payload = message.getPayload();
        OnenetMq.Msg obj = OnenetMq.Msg.parseFrom(payload);
        service.execute(() -> handler.handle(obj.getMsgid(), new String(obj.getData().toByteArray())));
    }

    @Override
    public void deliveryComplete(IMqttDeliveryToken token) {
        Client = token.getClient();
    }

    public IMqttAsyncClient getClient() {
        return Client;
    }
}