package com.seer.teach.netty.im.utils;

import com.seer.teach.common.dto.mq.LlmChatDTO;
import lombok.Data;

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;


/**
 *
 * <p>
 *
 * </p >
 *
 * @author Captain
 * @since 2025-10-24 14:47
 */
@Data
public class DeviceSession {

    /**
     * 设备标识符
     */
    final String device;

    /**
     * Redis通道名称
     */
    final String redisChannelName;

    /**
     * LLM聊天数据传输对象队列，用于存储待处理的消息块
     */
    final Queue<LlmChatDTO> queue = new ConcurrentLinkedQueue<>();

    /**
     * 窗口大小计数器，用于控制批量处理的数量
     */
    final AtomicInteger window = new AtomicInteger(RedisAudioChannelSubscriber.MIN_BATCH);

    /**
     * 取消状态标志，用于标识会话是否已被取消
     */
    final AtomicBoolean cancelled = new AtomicBoolean(false);

    /**
     * 确认响应的平均时间
     */
    volatile double ackAvg = 0;

    /**
     * 稳定计数器，用于统计稳定状态的次数
     */
    final AtomicInteger stableCount = new AtomicInteger(0);

    /**
     * 构造函数，初始化设备会话
     *
     * @param device 设备标识符
     * @param redisChannelName Redis通道名称
     */
    DeviceSession(String device, String redisChannelName) {
        this.device = device;
        this.redisChannelName = redisChannelName;
    }

    /**
     * 向队列中添加消息块
     *
     * @param dto LLM聊天数据传输对象
     */
    void addChunk(LlmChatDTO dto) {
        // 只有在未取消状态下才添加消息块到队列
        if (!cancelled.get()) {
            queue.add(dto);
        }
    }

    /**
     * 取消会话，清空队列中的所有消息
     */
    void cancel() {
        // 设置取消状态并清空队列
        cancelled.set(true);
        queue.clear();
    }
}

