package com.yonge.cooleshow.biz.dal.service;

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

import com.yonge.cooleshow.biz.dal.dto.SysMessageDto;
import com.yonge.cooleshow.biz.dal.entity.SysMessage;
import com.yonge.cooleshow.biz.dal.enums.MessageSendMode;
import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
import com.yonge.toolset.base.page.PageInfo;
import com.yonge.toolset.base.page.QueryInfo;
import com.yonge.cooleshow.common.entity.Mapper;
import com.yonge.toolset.mybatis.service.BaseService;
import com.yonge.toolset.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<Long> userIds, MessageTypeEnum messageType,String memo, 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<Long, String> receivers, Date triggerTime,
			Integer readStatus, String url,String jpushType, Object... args);
	
	
	public void batchSendMessage(MessageSender messageSender, String title, String content, Map<Long, String> receivers, Date triggerTime,
			Integer readStatus, String url,String jpushType, Object... args);


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

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

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

	/**
	 * 获取已经发送的验证码
	 * @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 List<Mapper>  queryCountOfUnread(MessageSendMode type, Long userId, String jpushType);

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

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

	String selectConfigUrl(String messageType,Object ...param);
}