import mqtt from 'mqtt';

const subscription = {
  topic: '/mec/+/objectlist/up',
  qos: 0,
};
export function useMqtt() {
  function shuttleMqtt() {
    const options = {
      //认证信息
      clientId: 'mqttjs_' + Math.random().toString(16).substr(2, 8),
      username: 'obu',
      password: 'obu&mqtt',
      connectTimeout: 4000, // 超时时间
      reconnectPeriod: 4000, // 重连时间间隔
      clean: true, // 保留会话
    };
    let client: any = undefined;
    const createConnection = (callback: any) => {
      try {
        client = mqtt.connect('ws://121.196.25.48:8083/mqtt', options);
      } catch (error) {
        console.log('mqtt.connect error', error);
      }
      client.on('connect', () => {
        console.log('Connection succeeded!');
        doSubscribe();
      });
      client.on('reconnect', (error: any) => {
        console.log('Reconnection:', error);
      });
      client.on('error', (error: any) => {
        console.log('Connection failed', error);
      });
      client.on('message', (topic: string, message: any) => {
        callback && callback(JSON.parse(message));
      });
    };

    const doSubscribe = () => {
      const { topic, qos } = subscription;
      client.subscribe(topic, qos, (error: any, res: any) => {
        if (error) {
          console.log('Subscribe to topics error', error);
          return;
        }
        console.log('Subscribe to topics res', res);
      });
    };

    const doUnSubscribe = () => {
      const { topic } = subscription;
      client.unsubscribe(topic, (error: any) => {
        if (error) {
          console.log('Unsubscribe error', error);
        }
      });
    };

    const destroyConnection = () => {
      if (client.connected) {
        try {
          client = { connected: false };
          console.log('Successfully disconnected!');
        } catch (error) {
          console.log('Disconnect failed', (error as any).toString());
        }
      }
    };

    return {
      createConnection,
      destroyConnection,
      doUnSubscribe,
    };
  }
  return {
    shuttleMqtt,
  };
}
