package com.emotion.service;

import com.emotion.dto.request.*;
import com.emotion.dto.response.*;
import java.util.Map;
import java.util.concurrent.CompletableFuture;

/**
 * AI聊天服务接口
 *
 * @author huazhongmin
 * @date 2025-07-24
 */
public interface AiChatService {

    /**
     * 发送聊天消息
     * 
     * @param request AI聊天请求
     * @return AI聊天响应
     */
    AiChatResponse sendChatMessage(AiChatRequest request);

    /**
     * 生成对话总结
     * 
     * @param request AI总结请求
     * @return AI总结响应
     */
    AiSummaryResponse generateConversationSummary(AiSummaryRequest request);

    /**
     * 获取AI服务状态
     * 
     * @return AI状态响应
     */
    AiStatusResponse getServiceStatus();

    /**
     * 获取聊天统计
     * 
     * @param request 聊天统计请求
     * @return 聊天统计响应
     */
    ChatStatsResponse getChatStats(ChatStatsRequest request);

    /**
     * 访客聊天
     * 
     * @param request  访客聊天请求
     * @param clientIp 客户端IP
     * @return 访客聊天响应
     */
    GuestChatResponse guestChat(GuestChatRequest request, String clientIp);

    /**
     * 获取访客用户信息
     * 
     * @param clientIp 客户端IP
     * @return 访客用户信息响应
     */
    GuestUserInfoResponse getGuestUserInfo(String clientIp);

    /**
     * 创建对话
     * 
     * @param request  对话创建请求
     * @param clientIp 客户端IP
     * @return 对话响应
     */
    ConversationResponse createConversation(ConversationCreateRequest request, String clientIp);

    /**
     * WebSocket方式发送聊天消息（只保存AI回复）
     * 
     * @param conversationId 会话ID
     * @param message        用户消息内容
     * @param userId         用户ID
     * @return AI回复内容
     */
    String sendChatMessageForWebSocket(String conversationId, String message, String userId);

    /**
     * WebSocket方式发送聊天消息（只保存AI回复，带messageId）
     * 
     * @param conversationId 会话ID
     * @param messageId      用户消息ID
     * @param message        用户消息内容
     * @param userId         用户ID
     * @return AI回复内容
     */
    String sendChatMessageForWebSocket(String conversationId, String messageId, String message, String userId);

    /**
     * 发送消息到Coze AI（不保存消息，仅AI交互）
     * 
     * @param conversationId 会话ID
     * @param userMessage    用户消息内容
     * @param userId         用户ID
     * @return AI回复内容
     */
    String sendMessage(String conversationId, String userMessage, String userId);

    /**
     * 流式聊天（暂时降级为普通聊天）
     * @param conversationId 会话ID
     * @param message 用户消息内容
     * @param userId 用户ID
     * @return AI回复内容
     */
    String streamChat(String conversationId, String message, String userId);

    /**
     * 健康检查
     * @return 健康返回true，否则false
     */
    boolean healthCheck();

    /**
     * 发送日记内容生成AI总结评论
     * 
     * @param conversationId 会话ID
     * @param userMessage    用户日记内容
     * @param userId         用户ID
     * @return AI评论内容
     */
    String sendSummaryMessage(String conversationId, String userMessage, String userId);

    /**
     * 生成用户情绪记录总结
     * @param userId 用户ID
     * @return 包含情绪总结等信息的Map
     */
    Map<String, Object> generateEmotionSummary(String userId);

    /**
     * 异步生成用户情绪记录总结
     * @param userId 用户ID
     * @return 包含情绪总结等信息的CompletableFuture
     */
    CompletableFuture<Map<String, Object>> generateEmotionSummaryAsync(String userId);

    /**
     * 生成用户情绪记录总结并返回响应对象
     * 
     * @param userId 用户ID
     * @return 情绪总结生成响应
     */
    EmotionSummaryGenerateResponse generateEmotionSummaryWithResponse(String userId);

    /**
     * 获取用户情绪记录总结状态并返回响应对象
     * 
     * @param userId 用户ID
     * @return 情绪总结状态响应
     */
    EmotionSummaryStatusResponse getEmotionSummaryStatusWithResponse(String userId);

    /**
     * 通过配置键调用Coze工作流API
     * 根据config_key从数据库获取AI配置，构建请求并调用Coze工作流接口
     * 默认使用流式调用方式
     * 
     * @param configKey AI配置键（如：coze.course.life.generate）
     * @param input 输入参数，将作为parameters.input传递给工作流
     * @param userId 用户ID
     * @return AI生成的内容
     * @throws RuntimeException 如果配置不存在或已禁用
     */
    String callWorkflowByConfigKey(String configKey, String input, String userId);

    /**
     * 通过配置键调用Coze工作流API（带自定义参数）
     * 根据config_key从数据库获取AI配置，将自定义参数与配置中的custom_params合并后调用工作流
     * 默认使用流式调用方式
     * 
     * @param configKey AI配置键
     * @param parameters 自定义参数Map，将合并到请求的parameters中
     * @param userId 用户ID
     * @return AI生成的内容
     * @throws RuntimeException 如果配置不存在或已禁用
     */
    String callWorkflowByConfigKey(String configKey, Map<String, Object> parameters, String userId);
}