package com.kym.service;

import com.kym.entity.Message;
import com.kym.entity.common.PageBean;
import com.kym.entity.queryParams.MessageQueryParams;
import com.kym.entity.vo.MessageVo;
import com.kym.service.mybatisplus.MyBaseService;

import java.util.List;
import java.util.Map;

/**
 * 消息通知服务接口
 *
 * @author skyline
 * @since 2024-01-15
 */
public interface MessageService extends MyBaseService<Message> {

    /**
     * 发送消息
     *
     * @param vo 消息VO
     */
    void sendMessage(MessageVo vo);

    /**
     * 批量发送消息
     *
     * @param vo 包含接收者列表的消息VO
     */
    void batchSendMessage(MessageVo vo);

    /**
     * 分页查询消息列表
     *
     * @param params 查询参数
     * @return 分页消息列表
     */
    PageBean<Message> listMessage(MessageQueryParams params);

    /**
     * 获取消息详情
     *
     * @param messageId 消息ID
     * @return 消息详情
     */
    Message getMessageDetail(Long messageId);

    /**
     * 标记消息已读
     *
     * @param messageId 消息ID
     */
    void markAsRead(Long messageId);

    /**
     * 批量标记已读
     *
     * @param messageIds 消息ID列表
     */
    void batchMarkAsRead(List<Long> messageIds);

    /**
     * 全部标记已读
     *
     * @param receiverId 接收者ID
     * @param type       消息类型（可选）
     */
    void markAllAsRead(Long receiverId, Integer type);

    /**
     * 删除消息
     *
     * @param messageId 消息ID
     */
    void deleteMessage(Long messageId);

    /**
     * 批量删除消息
     *
     * @param messageIds 消息ID列表
     */
    void batchDeleteMessage(List<Long> messageIds);

    /**
     * 获取未读消息数量
     *
     * @param receiverId 接收者ID
     * @return 未读数量
     */
    int getUnreadCount(Long receiverId);

    /**
     * 按类型获取未读消息数量
     *
     * @param receiverId 接收者ID
     * @return 各类型未读数量
     */
    Map<Integer, Integer> getUnreadCountByType(Long receiverId);

    /**
     * 获取最新未读消息（用于下拉预览）
     *
     * @param receiverId 接收者ID
     * @param limit      数量限制
     * @return 最新消息列表
     */
    List<Message> getLatestUnread(Long receiverId, int limit);
}
