package com.emotion.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.emotion.common.BasePageRequest;
import com.emotion.common.PageResult;
import com.emotion.dto.request.MessagePageRequest;
import com.emotion.dto.request.MessageSearchRequest;
import com.emotion.dto.request.MessageRecentRequest;
import com.emotion.dto.request.MessageCreateRequest;
import com.emotion.dto.response.MessageResponse;
import com.emotion.entity.Message;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 消息服务接口
 * 
 * @author huazhongmin
 * @date 2025-09-08
 */
public interface MessageService extends IService<Message> {
    
    /**
     * 分页查询消息
     */
    IPage<Message> getPage(BasePageRequest request);
    
    /**
     * 分页查询消息响应
     */
    PageResult<MessageResponse> getPageWithResponse(MessagePageRequest request);

    /**
     * 根据会话ID分页查询消息
     */
    IPage<Message> getPageByConversationId(BasePageRequest request, String conversationId);
    
    /**
     * 根据会话ID查询消息列表
     */
    List<Message> getByConversationId(String conversationId);
    
    /**
     * 根据发送者查询消息列表
     */
    List<Message> getBySender(String sender);
    
    /**
     * 根据时间范围查询消息
     */
    List<Message> getByTimeRange(String conversationId, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 根据用户ID和时间范围查询消息
     */
    List<Message> getByUserIdAndTimeRange(String userId, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 根据用户ID分页查询消息
     */
    IPage<Message> getByUserIdWithPage(String userId, Integer current, Integer size);

    /**
     * 根据用户ID和关键词搜索消息
     */
    List<Message> searchByUserIdAndKeyword(String userId, String keyword, Integer limit);

    /**
     * 根据用户ID获取最近的消息
     */
    List<Message> getRecentByUserId(String userId, Integer limit);

    /**
     * 查询会话的最后一条消息
     */
    Message getLastMessageByConversationId(String conversationId);
    
    /**
     * 根据父消息ID查询回复消息
     */
    List<Message> getRepliesByParentId(String parentMessageId);
    
    /**
     * 统计会话的消息数量
     */
    Long countByConversationId(String conversationId);
    
    /**
     * 统计发送者的消息数量
     */
    Long countBySender(String sender);
    
    /**
     * 查询未读消息数量
     */
    Long countUnreadMessages(String conversationId);
    
    /**
     * 更新消息状态
     */
    boolean updateStatus(String messageId, String status);
    
    /**
     * 更新消息已读状态
     */
    boolean updateReadStatus(String messageId, Integer isRead);
    
    /**
     * 批量更新会话消息为已读
     */
    boolean markConversationMessagesAsRead(String conversationId);
    
    /**
     * 创建消息
     */
    Message createMessage(Message message);
    
    /**
     * 标记消息为已读
     */
    boolean markAsRead(String messageId);

    /**
     * 获取用户消息分页（新接口）
     */
    PageResult<MessageResponse> getUserMessagesWithPage(MessagePageRequest request);

    /**
     * 搜索用户消息（新接口）
     */
    List<MessageResponse> searchUserMessages(MessageSearchRequest request);

    /**
     * 获取用户最近消息（新接口）
     */
    List<MessageResponse> getUserRecentMessages(MessageRecentRequest request);

    /**
     * 根据请求创建消息（新接口）
     */
    MessageResponse createMessageFromRequest(MessageCreateRequest request);

    /**
     * 根据ID获取消息响应（新接口）
     */
    MessageResponse getMessageById(String id);

    /**
     * 搜索消息并返回响应
     */
    PageResult<MessageResponse> searchWithResponse(MessageSearchRequest request);

    /**
     * 获取最近消息并返回响应
     */
    PageResult<MessageResponse> getRecentWithResponse(MessageRecentRequest request);

    /**
     * 更新消息
     */
    MessageResponse updateMessage(String id, String content);

    /**
     * 删除消息
     */
    boolean deleteMessage(String id);
}