package org.xyzh.api.ai.service;

import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import org.xyzh.api.ai.dto.ChatPrepareData;
import org.xyzh.api.ai.dto.TbChat;
import org.xyzh.api.ai.dto.TbChatMessage;
import org.xyzh.common.core.domain.ResultDomain;
import org.xyzh.common.core.page.PageDomain;
import org.xyzh.common.core.page.PageRequest;

public interface AgentChatService {

    // ====================== 智能体会话管理 ======================
    /**
     * 创建新会话
     * @param agentId 智能体ID
     * @param title 会话标题（可选）
     * @return 会话信息
     */
    ResultDomain<TbChat> createChat(TbChat chat);

    /**
     * 更新会话名称
     * @param agentId 智能体ID
     * @param chatId 会话ID
     * @param title 会话标题（可选）
     * @return 会话信息
     */
    ResultDomain<TbChat> updateChat(TbChat chat);

    /**
     * 删除会话
     * @param agentId 智能体ID
     * @param chatId 会话ID
     * @return 会话信息
     */
    ResultDomain<TbChat> deleteChat(TbChat chat);

    /**
     * 获取会话列表
     * @param agentId 智能体ID
     * @return 会话列表
     */
    ResultDomain<TbChat> getChatList(TbChat filter);

    /**
     * 分页获取会话列表
     * @param pageRequest 分页请求参数
     * @return 分页会话列表
     */
    ResultDomain<TbChat> getChatPage(PageRequest<TbChat> pageRequest);


    // ====================== 智能体聊天管理 ======================

    /**
     * 获取会话消息列表
     * @param filter 会话过滤条件（包含agentId, chatId, userId, userType）
     * @return 会话消息列表
     */
    ResultDomain<TbChatMessage> getChatMessageList(TbChat filter);
    
    /**
     * 准备聊天数据（POST传递复杂参数）
     * @param prepareData 对话准备数据（包含agentId, chatId, query, files, userId, userType）
     * @return ResultDomain<String> 返回sessionId
     */
    ResultDomain<String> prepareChatMessageSession(ChatPrepareData prepareData);

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

    /**
     * 停止对话生成（通过Dify TaskID）
     * @param filter 会话过滤条件（包含agentId, userId, userType）
     * @param taskId Dify任务ID
     * @return 停止结果
     */
    ResultDomain<Boolean> stopChatMessageByTaskId(TbChat filter, String taskId);

    /**
     * 评价
     * @param filter 会话过滤条件（包含agentId, chatId, userId, userType）
     * @param messageId 消息ID
     * @param comment 评价
     * @return 评价结果
     */
    ResultDomain<Boolean> commentChatMessage(TbChat filter, String messageId, String comment);


}
