package com.sunxung.factoring.service.sys.systemMsg;

import java.util.Date;
import java.util.List;

import com.sunxung.factoring.entity.GridPage;
import com.sunxung.factoring.entity.sys.systemMsg.MsgReadState;
import com.sunxung.factoring.entity.sys.systemMsg.SystemMsg;
import com.sunxung.factoring.entity.sys.systemMsg.SystemMsgReadDetail;
import com.sunxung.factoring.entity.sys.systemMsg.SystemMsgUnreadNum;
import com.sunxung.factoring.entity.sys.systemMsg.SystemMsgUserRel;
import com.sunxung.factoring.entity.sys.systemMsg.vo.FlowableMsgTips;
import com.sunxung.factoring.entity.sys.systemMsg.vo.SearchSystemMsg;

public interface SystemMsgService {

    GridPage<SystemMsg> findSentList(SearchSystemMsg search);

    SystemMsg add(SystemMsg systemMsg);

    SystemMsg get(Long id);

    boolean delete(Long id);

    void addSystemMsgUser(Long systemMsgId, Long receiverUserId, boolean readState, boolean receiverRemove);

    /**
     * 根据消息id和接收人ID删除关联数据. <br/>
     * 
     * @param systemMsgId
     * @param receiverUserId
     * @return
     */
    boolean deleteBySystemMsgUserId(Long id, Long receiverUserId);

    /**
     * 修改阅读状态. <br/>
     * 
     * @param id
     * @param readState
     */
    boolean updateReadState(MsgReadState msgRead);

    /**
     * 根据消息ID查询关联表. <br/>
     * 
     * @param systemMsgId
     * @return
     */
    Integer countBySystemMsgId(Long systemMsgId, Boolean readState);

    /**
     * 获取已发送消息查看数据. <br/>
     * 
     * @param id
     * @return
     */
    SystemMsg getSentMsgView(Long id);

    /**
     * 获取查看消息已读未读详情数据. <br/>
     * 
     * @param id
     * @return
     */
    SystemMsgReadDetail getSystemMsgReadDetail(Long id);

    /**
     * 删除已发送消息. <br/>
     * 
     * @param ids
     * @return
     */
    boolean deleteSentMsg(MsgReadState msgRead);

    /**
     * 分页查询消息管理列表数据. <br/>
     * 
     * @param search
     * @return
     */
    GridPage<SystemMsg> findMessageManageList(SearchSystemMsg search);

    /**
     * 获取消息管理列表中查看详情数据. <br/>
     * 
     * @param id
     * @return
     */
    SystemMsg getMsgDetail(Long id);

    /**
     * 删除消息管理列表中的数据. <br/>
     * 
     * @param ids
     * @return
     */
    boolean deleteMsg(MsgReadState msg);

    /**
     * 发送流程业务的系统待办消息、知晓消息. <br/>
     * 
     * @param title 标题
     * @param content 内容
     * @param receiverUserIds 接收人集合
     * @param businessId 业务ID
     * @param businessType 业务类型Code（业务模块，例如立项管理，尽调管理-SystemBusinessModuleDict）
     * @param handleMsg 是否是处理消息（待办消息），标识是否可以链接跳转，默认0-否（即知晓消息），1-是
     * @param taskId 待处理任务ID
     * @return
     */
    SystemMsg sendFlowMsgImmediately(String title, String content, List<Long> receiverUserIds, Long businessId,
            String businessType, boolean handleMsg, String taskId);

    /**
     * 发送业务模块的定时知晓消息. <br/>
     * 
     * @param title 标题
     * @param content 内容
     * @param receiverUserIds 接收人集合
     * @param businessId 业务ID
     * @param businessType 业务类型Code（业务模块，例如再融资资金管理-SystemBusinessModuleDict）
     * @param msgType 消息类型code MsgTypeDict
     * @param taskId 待处理任务ID
     * @return
     */
    SystemMsg sendBusinessMsgTiming(String title, String content, List<Long> receiverUserIds, Long businessId,
            String businessType, String msgType, String taskId, Date pushTime);
    
    /**
     * 发送正常催收、逾期催收、信保提醒业务的催收、信保提醒消息. <br/>
     * 
     * @param title 标题
     * @param content 内容
     * @param receiverUserIds 接收人集合
     * @param businessId 业务ID
     * @param businessType 业务类型Code（业务模块，例如立项管理，尽调管理-SystemBusinessModuleDict）
     * @param msgType 消息类型code MsgTypeDict
     * @param taskId 待处理任务ID
     * @return
     */
    SystemMsg sendBusinessMsgImmediately(String title, String content, List<Long> receiverUserIds, Long businessId,
            String businessType, String msgType, String taskId);

    /**
     * 查询用户所有未读消息数量. <br/>
     * 
     * @return
     */
    SystemMsgUnreadNum getUnreadMessageNum();

    /**
     * 发送定时消息. <br/>
     */
    void sentTimingMessage();

    /**
     * 根据消息ID修改用户消息中间表的接收人是否已删除. <br/>
     * 
     * @param systemMsgId
     * @param receiverRemove
     * @return
     */
    Integer updateReceiverRemoveByMsgId(Long systemMsgId, Boolean receiverRemove, Long userId);

    /**
     * 根据消息ID查询消息用户关联中间表. <br/>
     * 
     * @param systemMsgId
     * @return
     */
    List<SystemMsgUserRel> findBySystemMsgId(Long systemMsgId);

    /**
     * 流程业务系统待办消息跳转时，判断任务是否已完成或被分配
     * 
     * @param taskId 任务ID
     * @return 流程信息提示对象
     */
    FlowableMsgTips existByTaskId(String taskId);

    /**
     * 根据业务ID和业务类型(数据字典CODE)获取其知晓类型消息的接收者ID.<br>
     * 
     * @param businessId 业务ID
     * @param businessType 业务类型CODE（业务模块，例如立项管理，尽调管理-SystemBusinessModuleDict）
     * @return
     */
    List<Long> findKnownewsByBusiness(Long businessId, String businessType);
}
