/**
 * 消息缓冲与派发模块
 * 负责消息的缓冲、分类和派发
 */
import { logger } from './logger.js';
/**
 * 消息缓冲区
 * 管理消息的存储、分类和派发
 */
export class MessageBuffer {
    buffer = [];
    resolvers = [];
    onMessageArrived = null;
    isPolling = false;
    /**
     * 设置消息到达回调
     * 当有新消息到达且正在 poll 等待时，会立即调用此回调
     */
    setOnMessageArrived(callback) {
        this.onMessageArrived = callback;
    }
    /**
     * 设置是否正在 poll 等待
     */
    setIsPolling(polling) {
        this.isPolling = polling;
    }
    /**
     * 添加消息到缓冲区
     */
    push(message) {
        this.buffer.push(message);
        logger.info(`[MessageBuffer] 消息入缓冲区，当前数量: ${this.buffer.length}`);
        // 如果正在 poll 等待，立即触发状态变化回调
        if (this.isPolling && this.onMessageArrived) {
            logger.info('[MessageBuffer] 检测到 poll 等待中，触发消息到达回调');
            this.onMessageArrived();
        }
        this.tryDispatch();
    }
    /**
     * 接收 Profile 推送。
     * 主流程：记录日志 -> 不进入未读缓冲区 -> 引导调用方通过 get_profile 获取身份详情。
     */
    setProfileMessage(profile) {
        logger.info(`[MessageBuffer] 收到 Profile 推送，displayName: ${profile.displayName}。身份信息请通过 get_profile 获取。`);
    }
    /**
     * 移除 Profile 系统消息。
     * 当前未再向未读消息注入 profile 信息，保留该方法仅为兼容既有调用链。
     */
    removeProfileMessage() {
        logger.info('[MessageBuffer] removeProfileMessage 被调用，当前无需移除未读身份消息');
    }
    /**
     * 检查是否有 Profile 消息。
     * 当前身份信息不会进入未读消息，因此固定返回 false。
     */
    hasProfileMessage() {
        return false;
    }
    /**
     * 获取 Profile 消息。
     * 当前身份信息不会进入未读消息，因此固定返回 null。
     */
    getProfileMessage() {
        return null;
    }
    /**
       * 阻塞等待新消息
       * 如果缓冲区有消息则立即返回，否则阻塞等待
       * @param timeoutMs 可选超时时间（毫秒），超时后返回空消息而不继续阻塞
       */
    poll(timeoutMs) {
        logger.info(`[MessageBuffer] poll() 被调用，buffer: ${this.buffer.length}${timeoutMs ? `，超时: ${timeoutMs}ms` : ''}`);
        // 缓冲区有消息则立即返回
        if (this.buffer.length > 0) {
            const messages = this.consumeAll();
            logger.info(`[MessageBuffer] poll 立即返回，私聊: ${messages.directMessages.length}，群聊: ${messages.groupMessages.length}`);
            return Promise.resolve(messages);
        }
        // 标记正在 poll 等待
        this.isPolling = true;
        // 缓冲区为空，阻塞等待
        return new Promise((resolve) => {
            let timer = null;
            const resolver = (messages) => {
                // 从列表中移除自己
                const index = this.resolvers.indexOf(resolver);
                if (index > -1) {
                    this.resolvers.splice(index, 1);
                }
                // 清除超时定时器
                if (timer) {
                    clearTimeout(timer);
                    timer = null;
                }
                // 标记不再 poll 等待
                this.isPolling = false;
                logger.info(`[MessageBuffer] poll 收到消息，私聊: ${messages.directMessages.length}，群聊: ${messages.groupMessages.length}`);
                resolve(messages);
            };
            this.resolvers.push(resolver);
            // 处理竞态：注册后立即尝试派发
            this.tryDispatch();
            // 设置超时：超时后移除 resolver 并返回空消息
            if (timeoutMs && timeoutMs > 0) {
                timer = setTimeout(() => {
                    const index = this.resolvers.indexOf(resolver);
                    if (index > -1) {
                        this.resolvers.splice(index, 1);
                    }
                    // 标记不再 poll 等待
                    this.isPolling = false;
                    logger.info(`[MessageBuffer] poll 超时（${timeoutMs}ms），返回空消息`);
                    resolve({ directMessages: [], groupMessages: [] });
                }, timeoutMs);
            }
        });
    }
    /**
     * 非阻塞获取消息
     */
    get() {
        if (this.buffer.length > 0) {
            const messages = this.consumeAll();
            logger.info(`[MessageBuffer] get 返回消息，私聊: ${messages.directMessages.length}，群聊: ${messages.groupMessages.length}`);
            return messages;
        }
        return { directMessages: [], groupMessages: [] };
    }
    /**
     * 获取缓冲区大小
     */
    size() {
        return this.buffer.length;
    }
    /**
     * 清空缓冲区
     */
    clear() {
        this.buffer = [];
        this.resolvers = [];
    }
    /**
       * 尝试派发缓冲区消息给等待的 resolver
       */
    tryDispatch() {
        // 当有 buffer 消息时，派发给等待的 resolver
        while (this.resolvers.length > 0 && this.buffer.length > 0) {
            const resolver = this.resolvers.shift();
            if (resolver) {
                const messages = this.consumeAll();
                resolver(messages);
            }
        }
    }
    /**
     * 消费缓冲区所有消息并分类
     */
    consumeAll() {
        const directMessages = [];
        const groupMessages = [];
        while (this.buffer.length > 0) {
            const msg = this.buffer.shift();
            if (msg) {
                if (this.isDirectMessage(msg)) {
                    directMessages.push(msg);
                }
                else {
                    groupMessages.push(msg);
                }
            }
        }
        return { directMessages, groupMessages };
    }
    /**
     * 判断消息类型
     * DirectMessage 的 msgId 是 string，GroupMessage 的 msgId 是 number
     */
    isDirectMessage(msg) {
        return typeof msg.msgId === 'string';
    }
}
//# sourceMappingURL=message-buffer.js.map