import mqtt, { MqttClient, OnMessageCallback } from 'mqtt';

class MQTT {
    url: string; // MQTT 地址
    topics: string[]; // 订阅地址列表
    client!: MqttClient;

    constructor(url: string, topics: string[], options: any) {
        this.url = url;
        this.topics = topics;
        this.init(options);
    }

    // 初始化 MQTT 客户端
    init(options: any) {
        this.client = mqtt.connect(this.url, options);

        // 连接成功时的处理
        this.client.on('connect', () => {
            console.log('MQTT 连接成功');
            this.subscribeTopics();
        });

        // 连接失败时的处理
        this.client.on('connectFail', (error: any) => {
            console.error('MQTT 连接失败:', error);
            this.handleReconnect();
        });

        // 重新连接时的处理
        this.client.on('reconnect', (error: Error) => {
            console.log('MQTT 重新连接:', error);
        });

        // 连接异常时的处理
        this.client.on('error', (error: any) => {
            console.error('MQTT 连接异常:', error);
            this.handleReconnect();
        });

        // 客户端离线时的处理
        this.client.on('offline', () => {
            console.log('MQTT 客户端离线');
            this.handleReconnect();
        });
    }

    // 处理重新连接
    handleReconnect() {
        console.log('尝试重新连接 MQTT 服务器');
        // 你可以在这里添加更多的逻辑，例如延迟重新连接
        setTimeout(() => {
            this.client.end();
            this.init(this.client.options); // 使用相同的选项重新初始化连接
        }, this.client.options.reconnectPeriod || 30000); // 默认重新连接间隔为 30 秒
    }

    // 订阅多个主题
    subscribeTopics() {
        this.topics.forEach((topic) => {
            this.client.subscribe(topic, (error: any) => {
                if (!error) {
                    console.log(`订阅成功: ${topic}`);
                } else {
                    console.error(`订阅失败: ${topic}`);
                }
            });
        });
    }

    // 取消订阅某个特定主题
    unsubscribeTopic(topic: string) {
        this.client.unsubscribe(topic, (error: Error) => {
            if (!error) {
                console.log(`取消订阅成功: ${topic}`);
            } else {
                console.error(`取消订阅失败: ${topic}`);
            }
        });
    }

    // 取消订阅所有主题
    unsubscribes() {
        this.topics.forEach((topic) => {
            this.unsubscribeTopic(topic);
        });
    }

    // 收到的消息处理
    get(callback: OnMessageCallback) {
        this.client.on('message', callback);
    }

    // 结束连接
    over() {
        this.client.end();
        console.log('MQTT 连接已结束');
    }
}

export default MQTT;
