package com.seer.teach.teacher.service;


import com.seer.teach.common.cache.dto.CorrectResultDTO;
import com.seer.teach.common.dto.mq.LlmChatDTO;
import com.seer.teach.teacher.common.llm.sse.req.LlmAiCorrectReq;
import com.seer.teach.teacher.common.llm.sse.req.LlmSseChatReq;
import com.seer.teach.teacher.common.llm.sse.req.LlmSseStudyReq;
import com.seer.teach.teacher.common.llm.sse.req.Message;
import com.seer.teach.teacher.common.llm.sse.resp.LlmSseStudyResp;
import reactor.core.Disposable;
import reactor.core.publisher.Flux;

import java.util.List;

/**
 *
 * <p>
 *
 * </p >
 *
 * @author Captain
 * @since 2025-09-27 14:06
 */
public interface LlmSseService {

    /**
     * AI聊天功能，根据用户ID和消息列表进行对话交互
     *
     * @param userId   用户唯一标识符
     * @param messages 消息列表，包含对话历史记录
     * @return 返回Flux流形式的LlmChatDTO对象，支持服务端推送事件
     */
    Flux<LlmChatDTO> aiChat(LlmSseChatReq llmReq);

    /**
     * AI批改功能，对用户提交的内容进行智能批改
     *
     * @param params 批改请求参数对象，包含待批改的内容和相关配置
     * @return 返回Flux流形式的字符串结果，支持实时推送批改进度和结果
     */
    Flux<CorrectResultDTO> aiCorrect(LlmAiCorrectReq params);

    /**
     * AI学习功能，提供智能化学习服务
     *
     * @param params 学习请求参数对象，包含学习内容和用户信息
     * @return 返回Flux流形式的LlmSseStudyResp对象，支持实时推送学习结果
     */
    Flux<LlmSseStudyResp> aiStudy(LlmSseStudyReq params);

    /**
     * 注册流式处理任务，用于管理用户的长连接会话
     *
     * @param userId     用户唯一标识符
     * @param type       流类型标识，用于区分不同的业务场景
     * @param disposable 可释放的流处理器，用于取消或清理资源
     */
    void registerStream(Integer userId, Integer type, Disposable disposable);

    /**
     * 移除用户的学习流记录
     * @param userId 用户ID
     */
    void removeStudyStream(Integer userId);

    /**
     * 移除用户的聊天流记录
     * @param userId 用户ID
     */
    void removeChatStream(Integer userId);

    /**
     * 移除指定用户和类型的流
     *
     * @param userId 用户ID，用于标识需要移除流的用户
     * @param type 流类型，用于指定需要移除的流的类型
     */
    void removeStream(Integer userId,Integer type);

    /**
     * 检查用户是否正在进行学习流处理
     *
     * @param userId 用户唯一标识符
     * @return 返回用户当前学习流的状态码，null表示无活动流
     */
    Boolean checkUserHasStudyStream(Integer userId);

}
