package com.nmgs.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import redis.clients.jedis.Jedis;

import javax.websocket.Session;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * Websocket工具类
 * 记录当前在线的链接对链接进行操作
 */
public class WebsocketUtil {
    /**
     * 日志信息
     */
    private static final Logger log = LoggerFactory.getLogger(WebsocketUtil.class);
    /**
     * 记录当前在线的Session
     */
    private static Map<String, Session> ONLINE_SESSION = new ConcurrentHashMap<>();
    private static Map<String, Session> ONLINE_SESSION_CHECK = new ConcurrentHashMap<>();
    public static final String sessionKey = "socketId";


    /**
     * 添加session
     *
     * @param userId
     * @param session
     */
    public static void addSession(String userId, Session session) {
        // 此处只允许一个用户的session链接。一个用户的多个连接，我们视为无效。
        ONLINE_SESSION.putIfAbsent(userId, session);
    }
    public static void addSessionCheck(String userId, Session session) {
        // 此处只允许一个用户的session链接。一个用户的多个连接，我们视为无效。
        ONLINE_SESSION_CHECK.putIfAbsent(userId, session);
    }

    /**
     * 关闭session
     *
     * @param userId
     */
    public static void removeSession(String userId) {
        ONLINE_SESSION.remove(userId);
    }
    public static void removeSessionCheck(String userId) {
        ONLINE_SESSION_CHECK.remove(userId);
    }

    /**
     * 给单个用户推送消息
     *
     * @param session
     * @param message
     */
    public static void sendMessage(Session session, String message) {
        if (session == null) {
            LogUtil.WriteLog_Info("websocket给前端发送消息======session为空{}" + message, "WebSocket");
            return;
        }
        synchronized(session) {
            LogUtil.WriteLog_Info("websocket给前端发送消息======" + session.getId() + "=={}" + message, "WebSocket");
            try {
                session.getBasicRemote().sendText(message);
            } catch (IOException e) {
            }
        }

    }

    /**
     * 向所有在线人发送消息
     *
     * @param message
     */
    public static void sendMessageForAll(String message) {
        //jdk8 新方法
        ONLINE_SESSION.forEach((sessionId, session) -> {
            if (session.isOpen()) {
                sendMessage(session, message);
            }
        });
    }

    public static void sendCheckMessageForAll(String message) {
        //jdk8 新方法
        ONLINE_SESSION_CHECK.forEach((sessionId, session) -> {
            LogUtil.WriteLog_Info("发送认证消息====="+message+"===sessionId====="+sessionId,"WebSocketUtil");
            if (session.isOpen()) {
                sendMessage(session, message);
            }
        });
    }

    /**
     * 根据用户ID发送消息
     *
     * @param result
     */
//    public static void sendMessage(String sessionId, AjaxResult result) {
//        sendMessage(sessionId, JSON.toJSONString(result));
//    }

    /**
     * 根据用户ID发送消息
     *
     * @param message
     */
    public static void sendMessage(String sessionId, String message) {

        Session session = ONLINE_SESSION.get(sessionId);
        Session sessionCheck = ONLINE_SESSION_CHECK.get(sessionId);
        //判断是否存在该用户的session，判断是否还在线
        if ((session == null || !session.isOpen()) && (sessionCheck == null || !sessionCheck.isOpen())) {
            return;
        }else{
            if(session == null || !session.isOpen()){
                session=sessionCheck;
            }
        }
        sendMessage(session, message);
    }

    /**
     * 根据ID获取Session
     *
     * @param sessionId
     */
    public static Session getSession(String sessionId) {
        Session session = ONLINE_SESSION.get(sessionId);
        return session;
    }

    public static int getSessionSize() {
        int sessionSize = ONLINE_SESSION.size();
        return sessionSize;
    }

    /**
     * 根据传过来的key获取session中的参数
     *
     * @param key
     * @param session
     * @return
     */
    public static String getParam(String key, Session session) {
        Map map = session.getRequestParameterMap();
        Object userId1 = map.get(key);
        if (userId1 == null) {
            return null;
        }

        String s = userId1.toString();
        s = s.replaceAll("\\[", "").replaceAll("]", "");

        if (!StringUtils.isEmpty(s)) {
            return s;
        }
        return null;
    }

}
