package com.red.circle.other.infra.database.mongo.service.message;

import com.red.circle.other.infra.database.mongo.entity.message.UserMessage;
import java.util.List;
import org.springframework.data.domain.Page;

/**
 * 用户消息服务接口.
 *
 * @author tf
 * @date 2025-10-14
 */
public interface UserMessageService {

  /**
   * 分页查询用户消息列表.
   *
   * @param userId   用户ID
   * @param isRead   是否已读（null-全部，true-已读，false-未读）
   * @param pageNo   页码（从1开始）
   * @param pageSize 每页大小
   * @return 分页结果
   */
  Page<UserMessage> pageUserMessages(Long userId, Boolean isRead, Integer pageNo, Integer pageSize);

  /**
   * 查询未读消息数量.
   *
   * @param userId 用户ID
   * @return 未读消息数量
   */
  Long countUnreadMessages(Long userId);

  /**
   * 根据消息ID查询.
   *
   * @param messageId 消息ID
   * @return 消息实体
   */
  UserMessage getByMessageId(String messageId);

  /**
   * 根据动作类型查询消息列表.
   *
   * @param userId     用户ID
   * @param actionType 动作类型
   * @param limit      查询数量限制
   * @return 消息列表
   */
  List<UserMessage> listByActionType(Long userId, String actionType, Integer limit);

  /**
   * 创建用户消息.
   *
   * @param message 消息实体
   * @return 创建后的消息实体
   */
  UserMessage createUserMessage(UserMessage message);

  /**
   * 批量创建用户消息.
   *
   * @param messages 消息列表
   * @return 创建后的消息列表
   */
  List<UserMessage> batchCreateUserMessages(List<UserMessage> messages);

  /**
   * 标记消息已读.
   *
   * @param messageId 消息ID
   * @param userId    用户ID（校验消息归属）
   * @return 是否成功
   */
  Boolean markAsRead(String messageId, Long userId);

  /**
   * 批量标记消息已读.
   *
   * @param messageIds 消息ID列表
   * @param userId     用户ID（校验消息归属）
   * @return 是否成功
   */
  Boolean batchMarkAsRead(List<String> messageIds, Long userId);

  /**
   * 标记所有消息已读.
   *
   * @param userId 用户ID
   * @return 是否成功
   */
  Boolean markAllAsRead(Long userId);

  /**
   * 删除消息（逻辑删除）.
   *
   * @param messageId 消息ID
   * @param userId    用户ID（校验消息归属）
   * @return 是否成功
   */
  Boolean deleteMessage(String messageId, Long userId);

  /**
   * 批量删除消息.
   *
   * @param messageIds 消息ID列表
   * @param userId     用户ID（校验消息归属）
   * @return 是否成功
   */
  Boolean batchDeleteMessages(List<String> messageIds, Long userId);

}