package org.xyzh.api.ai.chat;

import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import org.xyzh.common.core.domain.ResultDomain;
import org.xyzh.api.ai.dto.DifyFileInfo;
import org.xyzh.common.dto.ai.TbAiConversation;
import org.xyzh.common.dto.ai.TbAiMessage;

import java.util.List;

/**
 * @description AI对话服务接口
 * @filename AiChatService.java
 * @author AI Assistant
 * @copyright xyzh
 * @since 2025-11-04
 */
public interface AiChatService {

    /**
     * 准备对话会话（POST传递复杂参数）
     * @param agentId 智能体ID
     * @param conversationId 会话ID（可选，为空则创建新会话）
     * @param query 用户问题
     * @param filesData 上传的文件列表（Dify文件信息）
     * @return ResultDomain<String> 返回sessionId
     */
    ResultDomain<String> prepareChatSession(
            String agentId,
            String conversationId,
            String query,
            List<DifyFileInfo> filesData
    );

    /**
     * 流式对话（SSE）- 使用sessionId建立SSE连接
     * @param sessionId 会话标识
     * @return SseEmitter 流式推送对象
     */
    SseEmitter streamChatWithSse(String sessionId);

    /**
     * 阻塞式对话（非流式）
     * @param agentId 智能体ID
     * @param conversationId 会话ID（可选）
     * @param query 用户问题
     * @param knowledgeIds 使用的知识库ID列表（可选）
     * @return 对话结果（包含完整回答）
     */
    ResultDomain<TbAiMessage> blockingChat(
            String agentId,
            String conversationId,
            String query
    );


    
    /**
     * 停止对话生成（通过Dify TaskID）
     * @param taskId Dify任务ID
     * @param agentId 智能体ID
     * @return 停止结果
     */
    ResultDomain<Boolean> stopChatByTaskId(String taskId, String agentId);

    /**
     * 创建新会话
     * @param agentId 智能体ID
     * @param title 会话标题（可选）
     * @return 会话信息
     */
    ResultDomain<TbAiConversation> createConversation(String agentId, String title);

    /**
     * 获取会话信息
     * @param conversationId 会话ID
     * @return 会话信息
     */
    ResultDomain<TbAiConversation> getConversation(String conversationId);

    /**
     * 更新会话（标题、摘要等）
     * @param conversation 会话信息
     * @return 更新结果
     */
    ResultDomain<TbAiConversation> updateConversation(TbAiConversation conversation);

    /**
     * 删除会话
     * @param conversationId 会话ID
     * @return 删除结果
     */
    ResultDomain<Boolean> deleteConversation(String conversationId);

    /**
     * 查询用户的会话列表
     * @param agentId 智能体ID（可选）
     * @return 会话列表
     */
    ResultDomain<TbAiConversation> listUserConversations(String agentId);

    /**
     * 查询会话的消息列表
     * @param conversationId 会话ID
     * @return 消息列表
     */
    ResultDomain<TbAiMessage> listMessages(String conversationId);

    /**
     * 获取单条消息
     * @param messageId 消息ID
     * @return 消息信息
     */
    ResultDomain<TbAiMessage> getMessage(String messageId);

    /**
     * 重新生成回答（SSE流式）
     * @param messageId 原消息ID
     * @return SseEmitter 流式推送对象
     */
    SseEmitter regenerateAnswerWithSse(String messageId);

    /**
     * 异步生成会话摘要
     * @param conversationId 会话ID
     * @return 异步任务结果
     */
    ResultDomain<Boolean> generateSummaryAsync(String conversationId);

    /**
     * 评价消息（点赞/点踩）
     * @param messageId 消息ID
     * @param rating 评分（1=好评，-1=差评，0=取消评价）
     * @param feedback 反馈内容（可选）
     * @return 评价结果
     */
    ResultDomain<Boolean> rateMessage(String messageId, Integer rating, String feedback);
}

