package com.gyee.frame.netty.websocket.util;

import com.alibaba.fastjson.JSON;
import com.gyee.frame.model.enumeration.Messagetype;
import com.gyee.frame.netty.websocket.WebSocketServer;
import com.gyee.frame.netty.websocket.config.SocketPageConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.ModelAndView;

import javax.websocket.EncodeException;
import java.io.IOException;

/**
 * @author Wang Jiawen
 * @purpose 作为websocket的工具类，继承了BaseService 全部功能，可用于快速跳转到指定的socket页面，并定位页面编号，以及相应的功能编号
 * ，同时集成了推送消息，打包以及相关功能
 * @date 2019-12-31 10:36
 */

abstract public class SocketToolService {
    @Autowired
    private WebSocketServer webSocketServer;

    /**
     *@author:Wang Jiawen
     *
     *@description: socket 页面指定位置进行跳转并调用具体的配置参数
     *
     *@param:[socketConfigMapId, route] 配置的mapid 例如模板socket1，要跳转到的页面路径
     *
     *@return:org.springframework.web.servlet.ModelAndView 返回modelandview 用于具体的跳转
     *
     *@createTime:2019/12/31
     *
     */
    public ModelAndView goSocketPage(String socketConfigMapId, String route) throws Exception {

        ModelAndView modelAndView=new ModelAndView(route);//定义一个modelandview
        String[] socketArray = SocketPageConfig.getInstance().getConfigMap(socketConfigMapId);//在配置里面进行取数
        String pageNumber = socketArray[0];
        String functionNumber = socketArray[1];
        //将取出后的页面编码，以及功能编码放入
        modelAndView.addObject("pageNumber", pageNumber);
        modelAndView.addObject("functionNumber", functionNumber);
        return modelAndView;
    }


    /**
     *@author:Wang Jiawen
     *
     *@description: 用于向web端推送数据
     *
     *@param:[pageNumber, functionNumber, message, type] 页面编号，功能编号，消息(可根据需求选择数据类型包含string，集合，对象，数组，map)，需要帮助转换的格式
     *     Messagetype type 如下:
     *     JSONTEXT(1,"JSONTEXT"),  //采用阿里巴巴json对字符串进行转换，那么会出现转换异常情况，经测试，但对常规的字符串转换正常,得到结果String类型
     *     JSONOBJECT(2,"JSONOBJECT"),//采用阿里巴巴json对字符串进行转换，那么会出现转换异常情况，经测试，但对常规的字符串转换正常,得到结果Object类型
     *     MESSAGE(3,"MESSAGE"),//消息类型，对于此类型，我们保留了字符串的格式，不对其进行转换
     *     CUSTOMIZE(4,"CUSTOMIZE");//自定义类型(需要重写convertmessage方法)，对于常规的消息，可能正常进行转换，但对于复杂类型消息无法转换成json，此时想要自定义的消息类型，请选用该模式
     *
     *@return:void
     *
     *@createTime:2020/1/9
     *
     */
    public void pushToWeb(String pageNumber, String functionNumber, Object message, Messagetype type)  {

        Integer messageNum = type.getMessageNum();

        if(messageNum==1){
            message = JSON.toJSONString(message);//对此转换成string格式
        }else if(messageNum==2){
            message = JSON.parse(JSON.toJSONString(message));//转换成json格式
        }else if(messageNum==3){
            //不处理
        }else if(messageNum==4){
            message = this.convertmessage(message); //调用已经写好的方法
        }
        try {
            //spring介入
            webSocketServer.sendObject(message,pageNumber,functionNumber);//调用socketserver进行推送消息
        } catch (IOException | EncodeException e ) {
            e.printStackTrace();
        }
    }

    public String convertmessage(Object message){
       return "";
    }

}
