package com.gyee.frame.common.websocket;

import com.gyee.frame.common.quartz.QuartzSchedulerUtil;
import org.springframework.context.event.EventListener;
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.messaging.SessionDisconnectEvent;

import java.util.concurrent.CopyOnWriteArraySet;

@Component
public class WebSocketCache  extends QuartzSchedulerUtil.SocketTaskUtil {

//    public static ConcurrentHashMap<String, CopyOnWriteArraySet<String>> websocketcacheMap = new ConcurrentHashMap();
//
//    @EventListener(SessionConnectEvent.class)
//    public void onSessionConnectEvent(SessionConnectEvent event) {
//
//        //获取Session连接信息
//        StompHeaderAccessor sha = StompHeaderAccessor.wrap(event.getMessage());
//
//        sha
//        List<String> topics=sha.getNativeHeader("topic");
//        //获取SessionId
//        String sessionId = sha.getSessionId();
//
//       if(StringUtils.isNotEmpty(topics))
//       {
//
//           String topic=topics.get(0);
//
//           if(websocketcacheMap.containsKey(topic))
//           {
//               CopyOnWriteArraySet<String> set=websocketcacheMap.get(topic);
//               set.add(sessionId);
//               websocketcacheMap.put(topic,set);
//           }else
//           {
//               CopyOnWriteArraySet<String> set= new CopyOnWriteArraySet<String>();
//               set.add(sessionId);
//               websocketcacheMap.put(topic,set);
//           }
//           if(InitialRunner.jobsmap.containsKey(topic))
//           {
//               this.restartJob(topic);
//           }
//       }
//
//
//    }
//
//
    @EventListener(SessionDisconnectEvent.class)
    public void onDisconnectEvent(SessionDisconnectEvent event) {
        //获取Session连接信息
        StompHeaderAccessor sha = StompHeaderAccessor.wrap(event.getMessage());
        //获取SessionId
        String sessionId = sha.getSessionId();


        if(WebSocketConfig.sessioncacheMap.containsKey(sessionId))
        {
            CopyOnWriteArraySet<String> sessionIdset=WebSocketConfig.sessioncacheMap.get(sessionId);

            for(String topic:sessionIdset)
            {
                if(WebSocketConfig.websocketcacheMap.containsKey(topic))
                {
                    CopyOnWriteArraySet<String> set=WebSocketConfig.websocketcacheMap.get(topic);
                    set.remove(sessionId);
                    WebSocketConfig.websocketcacheMap.put(topic,set);

                    if(set.size()==0)
                    {
                        WebSocketConfig.websocketcacheMap.remove(topic);
                        this.deleteJob(topic);
                    }
                }



                sessionIdset.remove(topic);
            }
            WebSocketConfig.sessioncacheMap.remove(sessionId);
        }


        if(WebSocketConfig.sessionparamcacheMap.containsKey(sessionId))
        {
            CopyOnWriteArraySet<String> sessionIdset=WebSocketConfig.sessionparamcacheMap.get(sessionId);

            for(String topic:sessionIdset)
            {
                if(WebSocketConfig.websocketparamcacheMap.containsKey(topic))
                {
                    CopyOnWriteArraySet<String> set=WebSocketConfig.websocketparamcacheMap.get(topic);
                    set.remove(sessionId);
                    WebSocketConfig.websocketparamcacheMap.put(topic,set);

                    if(set.size()==0)
                    {
                        WebSocketConfig.websocketparamcacheMap.remove(topic);
                        this.deleteJob(topic);
                    }
                }

                sessionIdset.remove(topic);
            }
            WebSocketConfig.sessionparamcacheMap.remove(sessionId);
        }


    }

}
