package com.zt.plat.module.qms.iot.tcpserver.core;

import com.zt.plat.module.qms.iot.tcpserver.IotDataUtils;
import com.zt.plat.module.qms.iot.tcpserver.IotDeviceType;
import com.zt.plat.module.qms.iot.tcpserver.IotPacket;
import com.zt.plat.module.qms.iot.tcpserver.IotUtils;
import lombok.extern.slf4j.Slf4j;
import tech.zzjc.tio.core.ChannelContext;
import tech.zzjc.tio.core.Tio;
import tech.zzjc.tio.utils.json.Json;


/**
 * <b>IotProtocol</b>
 * <p>
 * 更新历史：
 * <pre> 版本         更新时间            更新者        更新内容<hr/>
 * V1.0      2019年9月25日          王兴荣         Add</pre>
 * <b>Copyright (C)  云南志者竟成科技有限公司</b> 
 * <p>
 * @author 王兴荣 &lt;xingrong_wang@will-way.cn&gt;
 * @version V1.0 
 * @since 2019年9月25日
 */
@Slf4j
public class IotProtocol {

    public static void handle(String text, ChannelContext channelContext) throws Exception {
        log.debug("服务端接收：" + text);
        //心跳消息
        if (IotPacket.PING.equalsIgnoreCase(text)) {
            IotUtils.replyHeartbeat(channelContext);
            return;
        }
        //有人串口服务器，连接时发送数据 注册包格式为：reg-iot-设备名称-设备编号 选择hex发送并在末尾添加换行键0A
        if (text.startsWith("reg-")) {
            //reg-iot-Balance-001
            String[] regs = text.split("-");
            if ("iot".equalsIgnoreCase(regs[1])) {
                channelContext.set("iotType", IotDeviceType.getByType(regs[2]));
                Tio.bindBsId(channelContext, regs[2] + regs[3]);
            } else {
                //reg-user-userid
                Tio.bindUser(channelContext, regs[2]);
            }
            channelContext.set("iotCode", regs[3]);
            channelContext.set("bsFlat", regs[1]);
            Tio.bindGroup(channelContext, regs[1]);
            return;
        }
        // 串口数据
        String data = null;
        // 有人串口服务器，注册包内容为数据携带
        if (text.startsWith("iot-")) {
            String[] infos = text.split("\\$");
            String reg = infos[0];
            data = infos[infos.length - 1].trim();
            String[] regs = reg.split("-");
            channelContext.set("iotType", IotDeviceType.getByType(regs[1]));
            Tio.bindBsId(channelContext, regs[1] + regs[2]);
            channelContext.set("iotCode", regs[2]);
            channelContext.set("bsFlat", regs[0]);
            Tio.bindGroup(channelContext, regs[0]);
        } else {
            data = text;
        }
        if (text.startsWith("{") && text.endsWith("}")) {
            ClientData clientData = Json.toBean(text, ClientData.class);
            switch (clientData.getType()) {
                case "register":
                    ClientRegister clientRegister = Json.toBean(clientData.getData(), ClientRegister.class);
                    channelContext.set("clientType", clientRegister.getClientType());
                    channelContext.set("clientCode", clientRegister.getClientCode());
                    channelContext.set("connDeviceCode", clientRegister.getConnDeviceCode());
                    channelContext.set("connType", clientRegister.getConnType());
                    channelContext.set("random", clientRegister.getRandom());
                    String[] connDeviceCode = clientRegister.getConnDeviceCode();
                    for (String connDevice : connDeviceCode) {
                        String connType = clientRegister.getConnType();
                        if(connType.equals(IotDeviceType.BALANCE.getType())){
                            IotDataUtils.addIot(clientRegister.getConnType() + connDevice, channelContext);
                            break;
                        }
                    }
                    break;
            }
            return;
        }
        String bsFlat = (String) channelContext.get("bsFlat");
        if ("iot".equals(bsFlat)) {
            IotDataUtils.hander(channelContext, data);
            return;
        }
        
    }
}
