package com.game.business.util.im;

import cn.hutool.core.date.BetweenFormatter;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.imsocket.util.ApiResult;
import org.springframework.imsocket.util.ImGroupInfo;
import org.springframework.imsocket.util.ImGroupUser;
import org.springframework.imsocket.util.SocketUtil;

import java.util.ArrayList;
import java.util.List;

/**
 * 发送消息的工具
 *
 * @author jiang
 */
public class ChatMsgUtil {
    private static Logger logger = LoggerFactory.getLogger(ChatMsgUtil.class);

    /**
     * 使用腾讯im
     */
    public static boolean use_tencent_Im = false;

    public static final int SYSTEM_MSG_USER_ID = 111;

    /**
     * 创建群组
     *
     * @param groupId      群组id
     * @param ownerId      群组拥有者
     * @param isQuietGroup 是否是静默群组
     * @param familyName 家族名称
     * @author jiang
     * @description
     * @date 2021/8/5 10:40
     */
    public static void createGroup(long groupId, long ownerId, boolean isQuietGroup, String familyName) {
        ImGroupUser imGroupUser = new ImGroupUser();
        imGroupUser.userId = ownerId;

        List<ImGroupUser> imGroupUserList = new ArrayList<>();
        imGroupUserList.add(imGroupUser);

        ImGroupInfo imGroupInfo = new ImGroupInfo();
        imGroupInfo.groupId = groupId;
        imGroupInfo.ownerId = ownerId;
        imGroupInfo.m_groupUser = imGroupUserList;
        imGroupInfo.isQuietGroup = isQuietGroup;

        if(use_tencent_Im){
            resultParsing(TencentCloudImUtil.createGroup(TencentCloudImConstant.GROUP_CHAT_TYPE_COMMUNITY, String.valueOf(ownerId), String.valueOf(groupId), familyName));
        }else {
            resultParsing(SocketUtil.createGroup(imGroupInfo));
        }
    }

    /**
     * 更换群组的拥有者
     *
     * @param groupId 群组id
     * @param ownerId 拥有这id
     */
    public static void changeGroupOwner(long groupId, long ownerId) {
        resultParsing(SocketUtil.changeGroupOwner(groupId, ownerId));
    }

    /**
     * 删除群组
     *
     * @param groupId 群组id
     * @author jiang
     * @description
     * @date 2021/8/5 10:48
     */
    public static void delGroup(long groupId) {
        resultParsing(SocketUtil.delGroup(groupId));
    }

    /**
     * 用户添加到群组
     *
     * @param groupId 群组id
     * @param userId  用户id
     * @author jiang
     * @description
     * @date 2021/8/5 10:47
     */
    public static void addUserToGroup(long groupId, long userId) {
        resultParsing(SocketUtil.addUserToGroup(groupId, userId));
    }

    /**
     * 将用户删除群组
     *
     * @param groupId 群组id
     * @param userId  用户id
     * @author jiang
     * @description
     * @date 2021/8/5 10:51
     */
    public static void removeUserFromGroup(long groupId, long userId) {
        resultParsing(SocketUtil.removeUserFromGroup(groupId, userId));
    }

    /**
     * 结果转换
     *
     * @param apiResult 接口返回的实体
     * @return null 表示成功 非null则为失败的消息
     * @author jiang
     * @description
     * @date 2021/8/5 10:46
     */
    private static void resultParsing(ApiResult apiResult) {
        logger.info(" ----------- 群组操作结果：{} ----------- ", apiResult.errMsg);
    }


    /**
     * 发送群聊系统通知
     *
     * @param groupId    群组id
     * @param msgType    消息类型
     * @param msgContent 消息内容
     * @author jiang
     * @description
     * @date 2021/8/5 14:00
     */
    public static void sendMsgToGroup(long groupId, int msgType, String msgContent) {
        if(use_tencent_Im){
            TencentCloudImUtil.sendGroupSystemNotification(String.valueOf(groupId), msgContent);
        }else {
            JSONObject msg = new JSONObject();
            msg.put("eventText", msgContent);

            JSONObject paramJson = new JSONObject();
            paramJson.put("messageType", msgType);
            paramJson.put("messageContent", msg);

            SocketUtil.sendMsgToGroup(SYSTEM_MSG_USER_ID, groupId, paramJson, false);
        }
    }


    /**
     * 发送群聊系统通知
     *
     * @param groupId    群组id
     * @param msgType    消息类型
     * @param msgContent 消息内容
     * @param isPlazaMsg 是否是广场消息
     * @author jiang
     * @description
     * @date 2021/8/5 14:00
     */
    public static void sendMsgToGroup(long groupId, int msgType, String msgContent, boolean isPlazaMsg) {

        JSONObject msg = new JSONObject();
        msg.put("eventText", msgContent);

        JSONObject paramJson = new JSONObject();
        paramJson.put("messageType", msgType);
        paramJson.put("messageContent", msg);

        SocketUtil.sendMsgToGroup(SYSTEM_MSG_USER_ID, groupId, paramJson, false, isPlazaMsg, isPlazaMsg);
    }

    /**
     * 发送群聊系统通知
     * isInstantMsg（缓存时间为10分钟）
     *
     * @param groupId    群组id
     * @param msgType    消息类型
     * @param extrJson   消息体内容
     * @param isPlazaMsg 是否是广场消息
     * @author jiang
     * @date 2021/8/9 10:35
     */
    public static void sendMsgToGroup(long groupId, int msgType, JSONObject extrJson, boolean isPlazaMsg) {
        JSONObject paramJson = new JSONObject();
        paramJson.put("messageType", msgType);
        paramJson.put("messageContent", extrJson);

        SocketUtil.sendMsgToGroup(SYSTEM_MSG_USER_ID, groupId, paramJson, false, isPlazaMsg, isPlazaMsg);
    }

    /**
     * 发送群聊系统通知,发送给群聊某一个人
     *
     * @param groupId    群组id
     * @param userId     用户id
     * @param msgType    消息类型
     * @param msgContent 消息内容
     * @author jiang
     * @date 2021/8/24 15:16
     */
    public static void sendMsgToGroupUser(long groupId, long userId, int msgType, String msgContent) {
        JSONObject extrJson = new JSONObject();
        extrJson.put("eventText", msgContent);

        JSONObject paramJson = new JSONObject();
        paramJson.put("messageType", msgType);
        paramJson.put("messageContent", extrJson);

        SocketUtil.sendMsgToGroupUser(SYSTEM_MSG_USER_ID, groupId, paramJson, false, false, userId);
    }

    /**
     * 用户向群组中发送消息，自己也接收
     *
     * @param fromUid    发送者id
     * @param groupId    群组id
     * @param msgType    消息类型
     * @param msgContent 消息内容
     * @author jiang
     * @description
     * @date 2021/8/5 14:14
     */
    public static void sendMsgToGroup(long fromUid, long groupId, int msgType, String msgContent, boolean isPlazaMsg) {

        JSONObject msg = new JSONObject();
        msg.put("eventText", msgContent);

        JSONObject paramJson = new JSONObject();
        paramJson.put("messageType", msgType);
        paramJson.put("messageContent", msg);

        SocketUtil.sendMsgToGroup(fromUid, groupId, paramJson, true, isPlazaMsg, isPlazaMsg);
    }

    /**
     * 用户向群组中发送消息，自己也接收
     *
     * @param fromUid 发送者id
     * @param groupId 群组id
     * @param msgType 消息类型
     * @param msgJson 消息内容的json
     * @author jiang
     * @description
     * @date 2021/8/5 14:14
     */
    public static void sendMsgToGroup(long fromUid, long groupId, int msgType, JSONObject msgJson, boolean isPlazaMsg) {
        JSONObject paramJson = new JSONObject();
        paramJson.put("messageType", msgType);
        paramJson.put("messageContent", msgJson);

        SocketUtil.sendMsgToGroup(fromUid, groupId, paramJson, true, isPlazaMsg, isPlazaMsg);
    }



    /**
     * 用户向群组中发送消息，自己也接收
     *
     * @param fromUid 发送者id
     * @param groupId 群组id
     * @param type 消息类型
     * @param msgJson 消息内容的json
     * @param isChatRecord app端是否是聊天记录 0，不是聊天记录（比如礼物的动图效果，不需要保存到历史记录）  1，是聊天记录（比如发送的红包，需要保存到历史记录）
     * @param onlineOnlyFlag 1表示消息仅发送在线成员，默认0表示发送所有成员，AVChatRoom(直播群)不支持该参数，-1表示此参数无效（用于直播群）
     * @author lilin
     * @description
     * @date 2022/6/8 14:14
     */
    public static void sendMsgToGroup(String fromUid, String groupId, String type, String subType, JSONObject msgJson, int isChatRecord, int onlineOnlyFlag) {
        JSONObject paramJson = new JSONObject();
        paramJson.put("isChatRecord", isChatRecord);
        if(isChatRecord == 1){
            paramJson.put("messageType", type);
            paramJson.put("messageContent", msgJson);
        }else {
            paramJson.put("type", type);
            paramJson.put("subType", subType);
            paramJson.put("content", msgJson);
        }

        TencentCloudImUtil.sendGroupMsg(groupId, fromUid, paramJson.toString(), onlineOnlyFlag);
    }



    /**
     * @param toUid
     * @param msgType 10001 语音检测应答
     * @param msgJson
     */
    public static void sendSysMsgToUser(long toUid, GroupChatMsgEnum msgType, JSONObject msgJson) {

        JSONObject jsonMsg = new JSONObject();


        jsonMsg.put("messageType", msgType.getCode());
        jsonMsg.put("messageContent", msgJson);


        SocketUtil.sendMsgToUser(SYSTEM_MSG_USER_ID, toUid, jsonMsg, false, true);
    }

    /**
     * 用户向另一个用户发送消息，自己也接收
     *
     * @param fromUid    发送者id
     * @param toUid      接收者id
     * @param msgType    消息类型
     * @param msgContent 消息内容
     * @author jiang
     * @description
     * @date 2021/8/5 14:14
     */
    public static void sendMsgToUser(long fromUid, long toUid, int msgType, String msgContent) {

        JSONObject msg = new JSONObject();
        msg.put("eventText", msgContent);
        msg.put("txt", msgContent);

        JSONObject paramJson = new JSONObject();
        paramJson.put("messageType", msgType);
        paramJson.put("messageContent", msg);

        SocketUtil.sendMsgToUser(fromUid, toUid, paramJson, true, false);
    }

    /**
     * 用户向另一个用户发送消息，自己也接收
     *
     * @param fromUid 发送者id
     * @param toUid   接收者id
     * @param msgType 消息类型
     * @param msgJson 消息内容的json
     * @author jiang
     * @description
     * @date 2021/8/5 14:14
     */
    public static void sendMsgToUser(long fromUid, long toUid, int msgType, JSONObject msgJson) {
        JSONObject paramJson = new JSONObject();
        paramJson.put("messageType", msgType);
        paramJson.put("messageContent", msgJson);

        SocketUtil.sendMsgToUser(fromUid, toUid, paramJson, true, false);
    }


    /**
     * 用户向另一个用户发送消息，自己也接收
     *
     * @param fromUid 发送者id  (默认adminstrator, 给null)
     * @param toUid   接收者id
     * @param type 消息类型
     * @param msgJson 消息内容的json
     * @param isChatRecord app端是否是聊天记录 0，不是聊天记录（比如礼物的动图效果，不需要保存到历史记录）  1，是聊天记录（比如发送的红包，需要保存到历史记录）
     * @param msgLifeTime 消息保存时间，-1表示默认（7天）
     * @author lilin
     * @description
     * @date 2022/6/8 14:14
     */
    public static void sendMsgToUser(String fromUid, String toUid, String type, String subType, JSONObject msgJson, int isChatRecord, int msgLifeTime) {
        JSONObject paramJson = new JSONObject();
        paramJson.put("isChatRecord", isChatRecord);
        if(isChatRecord == 1){
            paramJson.put("messageType", type);
            paramJson.put("messageContent", msgJson);
        }else {
            paramJson.put("type", type);
            paramJson.put("subType", subType);
            paramJson.put("content", msgJson);
        }


        TencentCloudImUtil.sendMsg(1, fromUid, toUid, paramJson.toString(), msgLifeTime);
    }


    /**
     * 用户向另一个用户发送消息，自己也接收, 用于一对一通话,结束时发送的消息
     *
     * @param fromUid 发送者id
     * @param toUid   接收者id
     * @param status  0:接通了 1:取消 2:拒绝 3:超时
     * @param isVideo 是否是视频  1:视频 0:语音
     * @param time    通话时间(秒)
     * @author jiang
     * @date 2021/8/5 14:14
     */
    public static void sendMsgToUserOoo(long fromUid, long toUid, int status, int isVideo, int time) {
        JSONObject paramJson = new JSONObject();
        if (isVideo == 1) {
            paramJson.put("messageType", GroupChatMsgEnum.TYPE_CALL_VIDEO.getCode());
        } else {
            paramJson.put("messageType", GroupChatMsgEnum.TYPE_CALL_VOICE.getCode());
        }

        JSONObject msgJson = new JSONObject();
        msgJson.put("status", status);
        if (isVideo == 1) {
            msgJson.put("title", "一对一视频");
        } else {
            msgJson.put("title", "一对一语音");
        }
        if (time > 0) {
            msgJson.put("time", DateUtil.formatBetween(time * 1000, BetweenFormatter.Level.SECOND));
        } else {
            msgJson.put("time", "");
        }
        paramJson.put("messageContent", msgJson);

        SocketUtil.sendMsgToUser(fromUid, toUid, paramJson, true, false);
    }


    /**
     * 全员推送
     *
     * @param type 消息类型
     * @param msgJson 消息内容的json
     * @param isChatRecord app端是否是聊天记录 0，不是聊天记录（比如礼物的动图效果，不需要保存到历史记录）  1，是聊天记录（比如发送的红包，需要保存到历史记录）
     * @author lilin
     * @description
     * @date 2022/6/8 14:14
     */
    public static void sendMsgToAll(String type, String subType, JSONObject msgJson, int isChatRecord) {
        JSONObject paramJson = new JSONObject();
        paramJson.put("isChatRecord", isChatRecord);
        if(isChatRecord == 1){
            paramJson.put("messageType", type);
            paramJson.put("messageContent", msgJson);
        }else {
            paramJson.put("type", type);
            paramJson.put("subType", subType);
            paramJson.put("content", msgJson);
        }

        TencentCloudImUtil.imAllGroupPush(paramJson.toString());
    }

    /**
     * 全员推送
     */
    public static void batchSendMsgToAll(List<String> users, GlobalMsgObject msg) {
//        JSONObject paramJson = new JSONObject();
//        paramJson.put("isChatRecord", isChatRecord);
//        if(isChatRecord == 1){
//            paramJson.put("messageType", type);
//            paramJson.put("messageContent", msgJson);
//        }else {
//            paramJson.put("type", type);
//            paramJson.put("subType", subType);
//            paramJson.put("content", msgJson);
//        }
        JSONObject paramJson = new JSONObject();
        paramJson.put("type", msg.getType());
        paramJson.put("subType", msg.getSubType());
        paramJson.put("content", msg.getMsgJson());
        TencentCloudImUtil.imPushBatchSendMsg(users, paramJson.toString());
//        TencentCloudImUtil.imAllGroupPush(paramJson.toString());
    }
}
