
package org.tio.sitexxx.im.server.handler.wx;

import cn.hutool.core.collection.CollectionUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.tio.jfinal.plugin.activerecord.Record;
import org.tio.sitexxx.service.model.main.*;
import org.tio.sitexxx.service.service.base.UserService;
import org.tio.sitexxx.service.service.chat.GroupService;
import org.tio.sitexxx.service.service.jpush.JPushService;
import org.tio.sitexxx.service.vo.Const;

import java.util.*;

/**
 * 推送业务服务
 * @author xufei
 * 2020年09月25日 下午5:57:32
 */
public class PushBizService {
	private static Logger				log	= LoggerFactory.getLogger(PushBizService.class);
	public static final PushBizService	me	= new PushBizService();

	/**
	 * 群消息推送
	 * @param groupid
	 * @param group
	 * @param user
	 * @param msg
	 * @author xufei
	 * 2020年12月22日 下午5:53:04
	 */
	public void sendGroupMsg(Long groupid, WxGroup group, User user, WxGroupMsg msg) {
		List<Record> pushUser = GroupService.me.groupUserToPush(groupid);
		if (CollectionUtil.isNotEmpty(pushUser)) {
			Map<String, String> extras = new HashMap<>();
			extras.put("chatName", group.getName());
			extras.put("nick", user.getNick());
			extras.put("text", msg.getResume());
			extras.put("chatlinkid", -groupid + "");
			List<Record> pushReg = new ArrayList<>();
			for (Record record : pushUser) {
				Integer sendUid = record.getInt("uid");
				if (!checkGroupUser(sendUid, groupid) || Objects.equals(user.getId(), sendUid)) {
					continue;
				}
				pushReg.add(record);
			}
			JPushService.me.handlerMorePush(pushReg, group.getName(), user.getNick() + ":" + msg.getResume(), extras);
		}
	}

	/**
	 * 好友消息推送
	 * @param uid 用户序号
	 * @param nick 用户昵称
	 * @param text 文本
	 * @author xufei
	 * 2020年12月22日 下午5:58:19
	 */
	public void sendFdMsg(Integer uid, String nick, String text, Map<String, String> extra) {
		WxJpushUser push = checkUserToRegid(uid);
		if (push != null) {
			JPushService.me.handlerPush(push.getType(), push.getToken(), push.getRegid(), nick, text, extra);
		}
	}

	/**
	 * 好友消息推送
	 * @param uid 用户序号
	 * @param nick 用户昵称
	 * @param text 文本
	 * @author xufei
	 * 2020年12月22日 下午5:58:19
	 */
	public void sendFdMsg(Integer uid, String nick, String text) {
		sendFdMsg(uid, nick, text, null);
	}

	/**
	 * 群聊推送check
	 * @param uid
	 * @return
	 * @author xufei
	 * 2020年9月29日 上午11:19:06
	 */
	public static boolean checkGroupUser(Integer uid, Long groupid) {
		if (uid == null || groupid == null) {
			log.error("群推送监测：传入参数为空");
			return false;
		}
		if (WxChatApi.isOnline(uid)) {
			//在线
			return false;
		}
		User user = UserService.ME.getById(uid);
		if (user == null) {
			//全局消息不提醒
			return false;
		}
		WxGroupUser wxGroupUser = GroupService.me.getGroupUser(uid, groupid);
		//群消息免打扰
		return wxGroupUser == null || !Objects.equals(wxGroupUser.getMsgfreeflag(), Const.YesOrNo.YES);
	}

	/**
	 * 检查用户是否推送-私聊
	 * @param uid
	 * @return
	 * @author xufei
	 * 2020年9月24日 下午2:34:15
	 */
	public static WxJpushUser checkUserToRegid(Integer uid) {
		if (uid == null) {
			log.error("个人推送监测：传入参数为空");
			return null;
		}
		if (WxChatApi.isOnline(uid)) {
			//在线
			return null;
		}
		//如果群聊为空，需要单用户查询，群聊上层已查询
		WxJpushUser jpushUser = WxJpushUser.dao.findFirst("select * from wx_jpush_user where uid = ?", uid);
		if (jpushUser == null) {
			return null;
		}
		User user = UserService.ME.getById(uid);
		if (user == null) {
			//全局消息不提醒
			return null;
		}
		return jpushUser;
	}
}
