package com.wzj.soopin.im.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.wzj.soopin.im.domain.SysMessage;
import com.wzj.soopin.im.domain.SysMessageTemplate;
import com.wzj.soopin.im.domain.bo.SysMessageBo;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import com.wzj.soopin.im.domain.vo.SysMessageVo;

import java.util.List;

/**
 * 消息Service接口
 *
 * @author ruoyi
 */
public interface ISysMessageService extends IService<SysMessage> {

    /**
     * 分页查询消息列表
     */
    TableDataInfo<SysMessageVo> selectPageMessageList(SysMessageBo bo, PageQuery pageQuery);

    /**
     * 查询未读消息分页（Page方式）
     */
    Page<SysMessageVo> selectUnreadMessagesPage(Long userId, Page<SysMessage> page);

    /**
     * 查询已读消息分页（Page方式）
     */
    Page<SysMessageVo> selectReadMessagesPage(Long userId, Page<SysMessage> page);

    /**
     * 向用户发送消息
     *
     * @param message 消息信息
     * @param userId 用户ID (Long类型)
     * @return 结果
     */
    int sendMessageToUser(SysMessageBo message, Long userId);

    /**
     * 向用户发送消息 (String类型用户ID)
     *
     * @param message 消息信息
     * @param userId 用户ID (String类型)
     * @return 结果
     */
    int sendMessageToUserByStringId(SysMessageBo message, String userId);

    /**
     * 向多个用户发送消息
     *
     * @param message 消息信息
     * @param userIds 用户ID列表 (String类型)
     * @return 结果
     */
    int sendMessageToUsers(SysMessage message, SysMessageTemplate template, List<String> userIds);

//    /**
//     *
//     * 发送自动消息
//     *
//     * @param message 消息信息
//     * @param userIds 用户ID列表
//     * @return 结果
//     */
//    int sendAutoMessage(SysMessageBo message, List<Long> userIds);

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

    /**
     * 查询用户未读消息分页列表
     *
     * @param userId 用户ID
     * @param pageQuery 分页参数
     * @return 消息分页列表
     */
    TableDataInfo<SysMessageVo> selectPageUnreadMessages(Long userId, PageQuery pageQuery);

    /**
     * 查询用户已读消息分页列表
     *
     * @param userId 用户ID
     * @param pageQuery 分页参数
     * @return 消息分页列表
     */
    TableDataInfo<SysMessageVo> selectPageReadMessages(Long userId, PageQuery pageQuery);

    /**
     * 查询消息列表
     *
     * @param message 消息信息
     * @return 消息列表
     */
    List<SysMessageVo> selectMessageList(SysMessageBo message);

    /**
     * 查询消息详细信息
     *
     * @param id 消息ID
     * @return 消息信息
     */
    SysMessageVo selectMessageById(Long id);

    /**
     * 新增消息
     *
     * @param message 消息信息
     * @return 结果
     */
    int insertMessage(SysMessageBo message);

    /**
     * 修改消息
     *
     * @param message 消息信息
     * @return 结果
     */
    int updateMessage(SysMessageBo message);

    /**
     * 批量删除消息
     *
     * @param ids 需要删除的消息ID数组
     * @return 结果
     */
    int deleteMessageByIds(Long[] ids);

    /**
     * 删除消息信息
     *
     * @param id 消息ID
     * @return 结果
     */
    int deleteMessageById(Long id);

    /**
     * 将BO对象转换为查询条件
     *
     * @param bo 业务对象
     * @return 查询条件
     */
    LambdaQueryWrapper<SysMessage> toWrapper(SysMessageBo bo);

    /**
     * 查询所有未发送且到期的定时消息
     * @param now 当前时间
     * @return 待发送的定时消息列表
     */
    List<SysMessage> getScheduledMessagesToSend(java.util.Date now);

    /**
     * 更新消息状态
     * @param messageId 消息ID
     * @param status 状态（0未发送 1已发送）
     */
    void updateMessageStatus(Long messageId, String status);

    /**
     * 查询消息实体对象
     * @param id 消息ID
     * @return SysMessage 实体
     */
    SysMessage selectEntityById(Long id);

    /**
     * 发送消息
     * @param bo
     * @return
     */
    boolean send(SysMessageBo bo);

}
