package com.ym.mec.biz.service;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.ym.mec.biz.dal.dto.SysMessageDto;
import com.ym.mec.biz.dal.entity.SysMessage;
import com.ym.mec.biz.dal.enums.MessageSendMode;
import com.ym.mec.biz.dal.enums.MessageTypeEnum;
import com.ym.mec.common.page.PageInfo;
import com.ym.mec.common.page.QueryInfo;
import com.ym.mec.common.service.BaseService;
import com.ym.mec.thirdparty.message.MessageSenderPluginContext.MessageSender;

public interface SysMessageService extends BaseService<Long, SysMessage> {
	
	public PageInfo<SysMessageDto> queryListPage(QueryInfo queryInfo);

	/**
	 * 修改消息对象
	 * @param message
	 * @return
	 */
	public int updateMessage(SysMessage message);

	/**
	 * 推送站内消息
	 * @param userIds
	 * @param messageType
	 * @return
	 */
	boolean batchSeoMessage(Set<Integer> userIds, MessageTypeEnum messageType,String memo, Object... args);

	/**
	 * 推送im文本消息,包含跳转链接
	 * @param senderId
	 * @param messageType
	 * @return
	 */
	void batchSendImMessage(MessageTypeEnum messageType,String senderId,String extra, String[] targetIds,String url, Object... args);

	/**
	 * 推送im文本消息,包含跳转链接
	 * @param senderId
	 * @param messageType
	 * @return
	 */
	void batchSendImGroupMessage(MessageTypeEnum messageType,String senderId,String extra, String[] targetIds,String url, Object... args);

	/**
	 * 发送消息
	 * @param messageSender 消息发送者
	 * @param messageType 消息类型
	 * @param receivers 消息接收者（Key:用户编号  value:消息接收对象）
	 * @param triggerTime 触发时间
	 * @param readStatus 阅读状态（0-未读  1-已读）
	 * @param url 超链接地址
	 * @param args 参数
	 * @return
	 */
	public void batchSendMessage(MessageSender messageSender, MessageTypeEnum messageType, Map<Integer, String> receivers, Date triggerTime,
			Integer readStatus, String url,String jpushType, Object... args);

	/**
	 * 发送消息
	 * @param messageSender 消息发送者
	 * @param userId 用户编号
	 * @param mode 消息模式
	 * @param title 消息标题
	 * @param content 消息内容
	 * @param receiver 消息接受者
	 * @param triggerTime 触发时间
	 * @param readStatus 阅读状态（0-未读  1-已读）
	 * @param url 超链接地址
	 * @param group 组
	 * @return
	 */
	public void sendMessage(MessageSender messageSender, Integer userId, String title, String content, String receiver, Date triggerTime, Integer readStatus,
			String url, String group,String jpushType);

	/**
	 * 发送验证码
	 * @param messageSender 消息发送者
	 * @param userId 用户编号
	 * @param mode 消息模式
	 * @param messageType 消息类型
	 * @param receiver 消息接受者
	 * @return
	 */
	public boolean sendSecurityCode(MessageSender messageSender, Integer userId, MessageTypeEnum messageType, String receiver);

	/**
	 * 获取已经发送的验证码
	 * @param type
	 * @param mobileNOOrEmailAddr
	 * @return
	 */
	public String getSendedVerificationCode(MessageTypeEnum type, String mobileNOOrEmailAddr);

	/**
	 * 删除已有的key
	 * @param type
	 * @param mobileNOOrEmailAddr
	 */
	public void delSendedVerificationCode(MessageTypeEnum type, String mobileNOOrEmailAddr);

	/**
	 * 查询消息未读条数
	 * @param type
	 * @param userId
	 * @return
	 */
	public Map<String, Integer> queryCountOfUnread(MessageSendMode type, Integer userId,String jpushType);

	/**
	 *
	 * @param userId 用户id
	 * @param status 状态/1 已读,0未读
	 * @return
	 */
	public int updateStatus(Integer userId, int status,String jpushType);

	/**
	 * 修改单条消息状态
	 */
	public int updateOneStatus(Long id, int status);
	
	public List<SysMessage> queryUserInRecentMinList(String mobile, int recentMin, MessageSendMode type);

	/**
	 * 发送私聊消息
	 * @param studentId
	 * @param content
	 */
    void sendPrivateMessage(String studentId, String content);

	/**
	 * 发送私聊消息
	 * @param sender
	 * @param receiver
	 * @param content
	 */
	void sendNoAuthPrivateMessage(String sender,String receiver, String content);

	/**
	 * 每天9点推送前一天22点之后的推送消息
	 */
	void pushWaitSendMessageTask();
}