package org.dromara.member.service;

import com.baomidou.mybatisplus.extension.service.IService;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.member.domain.AppMessage;
import org.dromara.member.domain.bo.AppMessageBo;
import org.dromara.member.domain.vo.AppMessageVo;

import java.util.Collection;
import java.util.List;

/**
 * App端消息Service接口
 *
 * @author pengles
 */
public interface AppMessageService extends IService<AppMessage> {

    /**
     * 查询App端消息
     *
     * @param messageId 消息ID
     * @return App端消息
     */
    AppMessageVo queryById(Long messageId);

    /**
     * 查询App端消息列表
     *
     * @param bo        App端消息
     * @param pageQuery 分页查询条件
     * @return App端消息集合
     */
    TableDataInfo<AppMessageVo> queryPageList(AppMessageBo bo, PageQuery pageQuery);

    /**
     * 查询App端消息列表
     *
     * @param bo App端消息
     * @return App端消息集合
     */
    List<AppMessageVo> queryList(AppMessageBo bo);

    /**
     * 新增App端消息
     *
     * @param bo App端消息
     * @return 结果
     */
    Boolean insertByBo(AppMessageBo bo);

    /**
     * 修改App端消息
     *
     * @param bo App端消息
     * @return 结果
     */
    Boolean updateByBo(AppMessageBo bo);

    /**
     * 校验并批量删除App端消息
     *
     * @param ids     主键集合
     * @param isValid 是否校验,true-删除前校验,false-不校验
     * @return 结果
     */
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);

    /**
     * 获取用户未读消息数量
     *
     * @param userId 用户ID
     * @return 未读消息数量
     */
    Long getUnreadCount(Long userId);

    /**
     * 标记消息为已读
     *
     * @param messageId 消息ID
     * @param userId    用户ID
     * @return 结果
     */
    Boolean markAsRead(Long messageId, Long userId);

    /**
     * 批量标记消息为已读
     *
     * @param messageIds 消息ID列表
     * @param userId     用户ID
     * @return 结果
     */
    Boolean markAsReadBatch(List<Long> messageIds, Long userId);

    /**
     * 标记所有消息为已读
     *
     * @param userId 用户ID
     * @return 结果
     */
    Boolean markAllAsRead(Long userId);

    /**
     * 发送系统消息
     *
     * @param bo 消息信息
     * @return 结果
     */
    Boolean sendSystemMessage(AppMessageBo bo);

    /**
     * 发送个人消息
     *
     * @param bo 消息信息
     * @return 结果
     */
    Boolean sendPersonalMessage(AppMessageBo bo);

    /**
     * 推送消息到指定用户
     *
     * @param bo 消息信息
     * @return 结果
     */
    Boolean pushMessage(AppMessageBo bo);

    /**
     * 群发消息
     *
     * @param bo 消息信息
     * @return 结果
     */
    Boolean broadcastMessage(AppMessageBo bo);

    /**
     * 发送推送通知
     *
     * @param userId  用户ID
     * @param title   标题
     * @param content 内容
     * @return 结果
     */
    Boolean sendPushNotification(Long userId, String title, String content);

    /**
     * 批量发送推送通知
     *
     * @param userIds 用户ID列表
     * @param title   标题
     * @param content 内容
     * @return 结果
     */
    Boolean sendBatchPushNotification(List<Long> userIds, String title, String content);

    /**
     * 清理过期消息
     *
     * @return 清理数量
     */
    Integer cleanExpiredMessages();
}