package com.YuyeTech.HeartRate.config.logback;


import com.YuyeTech.HeartRate.config.websocket.MyEndpointConfigure;
import com.YuyeTech.HeartRate.utils.ErrorUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * WebSocket获取实时日志并输出到Web页面
 */
@Slf4j
@Component
@ServerEndpoint(value = "/websocket/APPLog/{appId}", configurator = MyEndpointConfigure.class)
public class AppLoggingWSServer {

    @Value("${spring.application.name}")
    private String applicationName;

    /**
     * 连接集合
     */
    private static Map<String, Session> appSessionMap = new ConcurrentHashMap<String, Session>();
    private static Map<String, Session> serverSessionMap = new ConcurrentHashMap<String, Session>();

    /**
     * 定义一个服务器server id
     */
    private String serverId = "10000";

    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(@PathParam("appId") String appId, Session session) {
        //添加到集合中
        if(appId.equals(serverId)){
            //定义服务器id = 10000
            serverSessionMap.put(serverId,session);
        }else{
            appSessionMap.put(appId, session);
        }
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose(@PathParam("appId") String appId, Session session) {
        //从集合中删除
        if(appId.equals(serverId)){
            //定义服务器id = 10000
            serverSessionMap.remove(serverId,session);
        }else{
            appSessionMap.remove(appId);
        }
    }

    /**
     * 发生错误时调用
     */
    @OnError
    public void onError(Session session, Throwable error) {
        //输出到日志文件中
        log.error(ErrorUtil.errorInfoToString(error));
    }

    /**
     * 服务器接收到客户端消息时调用的方法
     */
    @OnMessage
    public void onMessage(@PathParam("appId") String appId, String message) {
        if(appId.equals(serverId)){
            log.info("服务器"+appId+":"+ message);
        }else{
            //如果不是服务器发送的消息
            log.info("客户端"+appId+":"+ message);
            serverSessionMap.forEach((sessionId,session) -> send(session,message));
        }
    }

    /**
     * 封装一个send方法，发送消息到前端
     */
    private void send(Session session, String message) {
        try {
            session.getBasicRemote().sendText(message);
        } catch (Exception e) {
            //输出到日志文件中
            log.error(ErrorUtil.errorInfoToString(e));
        }
    }
}
