package com.hdl.sdk.hdl_core.HDLDeviceManger.Parser;

import com.hdl.sdk.hdl_core.Config.Configuration;
import com.hdl.sdk.hdl_core.HDLAppliances.Config.HDLApConfig;
import com.hdl.sdk.hdl_core.HDLAppliances.HDLLogic.LogicMode;
import com.hdl.sdk.hdl_core.HDLDeviceManger.Bean.AppliancesInfo;
import com.hdl.sdk.hdl_core.HDLDeviceManger.Bean.DevicesData;
import com.hdl.sdk.hdl_core.HDLDeviceManger.Core.HDLDeviceManager;
import com.hdl.sdk.hdl_core.HDLDeviceManger.Core.HandleSearch;
import com.hdl.sdk.hdl_core.Util.LogUtil.HDLLog;

import java.util.ArrayList;
import java.util.List;

import static com.hdl.sdk.hdl_core.HDLDeviceManger.Core.HDLDeviceManager.devicesDataList;

/**
 * Created by djl on 2017/3/29.
 */

public class DeviceParser {

    /**
     * 处理解析、设置某一回路的所有信息
     *
     * @param addBytes
     * @param port
     * @param ipAddress
     * @param devicesData
     * @param parentRemarks
     * @return 172.168.52.51 固件版本号2018/08/29
     */
    public static boolean parse(byte[] addBytes, int port, String ipAddress, DevicesData devicesData, String parentRemarks) {
        boolean isExitData = false;
        int residue = addBytes.length - 22;
        int sumCount = residue / 3;//记录总共有多少种设备
        List<AppliancesInfo> appliancesInfoList = new ArrayList<>();
        if (sumCount == 0) {
            AppliancesInfo appliancesInfo = new AppliancesInfo();
            appliancesInfo.setDeviceName(Configuration.UNKNOW_TYPE);
            appliancesInfoList.add(appliancesInfo);
        }
        int curCount = 0;//循环遍历所有设备次数
        while (curCount < sumCount) {
            int bigType = addBytes[21 + (2 * curCount) + (curCount + 1)] & 0xFF;
            int littleType = addBytes[21 + (2 * curCount) + (curCount + 2)] & 0xFF;
            int channelNum = addBytes[21 + (2 * curCount) + (curCount + 3)] & 0xFF;
            curCount++;
            int curChannelNum = 0;
            while (curChannelNum < channelNum) {
                curChannelNum++;
                if (isWantData(bigType, littleType)) {
                    AppliancesInfo appliancesInfo = new AppliancesInfo();

                    switch (bigType) {
                        case Configuration.LIGTH_BIG_TYPE:
                            parseLightData(littleType, appliancesInfo, devicesData, parentRemarks, curChannelNum, port, ipAddress);
                            break;
                        case Configuration.CURTAIN_BIG_TYPE:
                            parseCurtainData(littleType, appliancesInfo, devicesData, parentRemarks, curChannelNum, port, ipAddress);
                            break;
                        case Configuration.AIR_BIG_TYPE:
                            parseAirData(littleType, appliancesInfo, devicesData, parentRemarks, curChannelNum, port, ipAddress);
                            break;
                        case Configuration.AUDIO_BIG_TYPE:
                            parseAudioData(littleType, appliancesInfo, devicesData, parentRemarks, curChannelNum, port, ipAddress);
                            break;
                        case Configuration.LOGIC_BIG_TYPE:
                            parseLogicData(littleType, appliancesInfo, devicesData, parentRemarks, curChannelNum, port, ipAddress);
                            break;
                        case Configuration.GLOBAL_LOGIC_BIG_TYPE:
                            parseGlobalLogicData(littleType, appliancesInfo, devicesData, parentRemarks, curChannelNum, port, ipAddress);
                            break;
                        case Configuration.SENSOR_BIG_TYPE:
                            parseSensorData(littleType, appliancesInfo, devicesData, parentRemarks, curChannelNum, port, ipAddress);
                            break;
                         //2019-07-08 新增地热和新风类
                        case Configuration.GEOTHERMAL_BIG_TYPE://地热
                            parseGeothermalData(littleType, appliancesInfo, devicesData, parentRemarks, curChannelNum, port, ipAddress);
                            break;
                        case Configuration.FRESH_AIR_BIG_TYPE:
                            parseFreshAirData(littleType, appliancesInfo, devicesData, parentRemarks, curChannelNum, port, ipAddress);
                            break;
                        default:
//                            appliancesInfo.setDeviceName(Configuration.UNKNOW_TYPE);
                            break;
                    }

                    isExitData = true;

                    String key = "K" + appliancesInfo.getBigType()
                            + "-" + appliancesInfo.getLittleType()
                            + "-" + appliancesInfo.getDeviceSubnetID()
                            + "-" + appliancesInfo.getDeviceDeviceID()
                            + "-" + appliancesInfo.getChannelNum();

                    appliancesInfo.setDeviceKey(key);//2019-8-2 添加唯一标识key
                    appliancesInfoList.add(appliancesInfo);

                } else {
                    HDLLog.info( "不是要添加的设备:大类:" + bigType + " 小类:" + littleType);
                }
            }
        }
        if (isExitData && devicesData != null) {
            devicesData.setAppliancesInfoList(appliancesInfoList);
        }
        return isExitData;
    }


    /**
     * 判断是否支持的设备,若不是支持设备则过滤掉。
     *
     * @param bigType
     * @param littleType
     * @return
     */
    private static boolean isWantData(int bigType, int littleType) {
//        HDLLog.info("isWantData:bigType:" + bigType + "littleType:" + littleType);
        boolean isWant;
        switch (bigType) {
            case Configuration.LIGTH_BIG_TYPE:
                switch (littleType) {
                    case 0:
                        isWant = true;
                        break;
                    case 1:
                        isWant = true;
                        break;
                    case 9:
                        isWant = true;
                        break;
                    case 10:
                        isWant = true;
                        break;
                    default:
                        isWant = false;
                        break;
                }
                break;
            case Configuration.CURTAIN_BIG_TYPE:
                switch (littleType) {
                    case 0:
                        isWant = true;
                        break;
                    case 1:
                        isWant = true;
                        break;
                    case 2:
                        isWant = true;
                        break;
                    default:
                        isWant = false;
                        break;
                }
                break;
            case Configuration.AIR_BIG_TYPE:
                switch (littleType) {
                    case 0:
                        isWant = true;
                        break;
                    case 3:
                        isWant = true;
                        break;
                    default:
                        isWant = false;
                        break;
                }
                break;
            case Configuration.AUDIO_BIG_TYPE:
                switch (littleType) {
                    case 0:
                        isWant = true;
                        break;
//                    case 1:
//                        isWant = true;
//                        break;
                    case 3:
                        isWant = true;
                        break;
                    default:
                        isWant = false;
                        break;
                }
                break;
            case Configuration.SENSOR_BIG_TYPE:
                if (littleType >= 0 && littleType <= 24) {
                    isWant = true;
                } else {
                    isWant = false;
                }
                break;
            case Configuration.LOGIC_BIG_TYPE:
                switch (littleType) {
                    case 0:
                        isWant = true;
                        break;
                    default:
                        isWant = false;
                        break;
                }
                break;
            case Configuration.GLOBAL_LOGIC_BIG_TYPE:
                switch (littleType) {
                    case 0:
                        isWant = true;
                        break;
                    default:
                        isWant = false;
                        break;
                }
                break;
            case Configuration.GEOTHERMAL_BIG_TYPE://20190711 新增
                switch (littleType) {
                    case Configuration.GEOTHERMAL_LITTLE_TYPE_0:
                        isWant = true;
                        break;
                    default:
                        isWant = false;
                        break;
                }
                break;
            case Configuration.FRESH_AIR_BIG_TYPE:
                switch (littleType) {
                    case Configuration.FRESH_AIR_LITTLE_TYPE_0:
                        isWant = true;
                        break;
                    default:
                        isWant = false;
                        break;
                }
                break;
            default:
                isWant = false;
                break;
        }
        return isWant;
    }

    private static void parseLightData(int littleType, AppliancesInfo appliancesInfo, DevicesData devicesData, String parentRemarks, int channelNum, int port, String ipAddress) {
        switch (littleType) {
            case 0:
                appliancesInfo.setDeviceName("调光回路");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_LIGHT_DIMMER);
                break;
            case 1:
                appliancesInfo.setDeviceName("开关回路");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_LIGHT_RELAY);
                break;
            case 2:
                appliancesInfo.setDeviceName("逻辑灯控制");
                break;
            case 3:
                appliancesInfo.setDeviceName("逻辑灯RGB");
                break;
            case 4:
                appliancesInfo.setDeviceName("逻辑灯RGBW");
                break;
            case 5:
                appliancesInfo.setDeviceName("逻辑灯RGB+CCT");
                break;
            case 6:
                appliancesInfo.setDeviceName("混合类 Dimmer+Relay");
                break;
            case 7:
                appliancesInfo.setDeviceName("DALI");
                break;
            case 8:
                appliancesInfo.setDeviceName("自定义逻辑灯");
                break;
            case 9:
                appliancesInfo.setDeviceName("混合调光类");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_LIGHT_MIX_DIMMER);
                break;
            case 10:
                appliancesInfo.setDeviceName("混合开关类");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_LIGHT_MIX_RELAY);
                break;
            default:
                appliancesInfo.setDeviceName(Configuration.UNKNOW_TYPE);
                break;
        }
        if (devicesData != null) {
            appliancesInfo.setChannelNum(channelNum);
            appliancesInfo.setBigType(Configuration.LIGTH_BIG_TYPE);
            appliancesInfo.setLittleType(littleType);
            appliancesInfo.setCtrlCommand(Configuration.LIGHT_CTRL_COMMAND);
            appliancesInfo.setCtrlBackCommand(Configuration.LIGHT_CTRL_BACK_COMMAND);
            appliancesInfo.setStateCommand(Configuration.LIGHT_STATE_COMMAND);
            appliancesInfo.setStateBackCommand(Configuration.LIGHT_STATE_BACK_COMMAND);
            appliancesInfo.setDeviceSubnetID(devicesData.getSourceSubnetID());
            appliancesInfo.setDeviceDeviceID(devicesData.getSourceDeviceID());
            appliancesInfo.setParentRemarks(parentRemarks);
            appliancesInfo.setPort(port);
            appliancesInfo.setIpAddress(ipAddress);
        }
    }

    private static void parseCurtainData(int littleType, AppliancesInfo appliancesInfo, DevicesData devicesData, String parentRemarks, int channelNum, int port, String ipAddress) {
        switch (littleType) {
            case 0:
                appliancesInfo.setDeviceName("开合帘电机");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_CURTAIN_GLYSTRO);
                break;
            case 1:
                appliancesInfo.setDeviceName("卷帘电机");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_CURTAIN_ROLLER);
                break;
            case 2:
                appliancesInfo.setDeviceName("窗帘模块");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_CURTAIN_MODULE);
                break;
            default:
                appliancesInfo.setDeviceName(Configuration.UNKNOW_TYPE);
                break;

        }
        if (devicesData != null) {
            appliancesInfo.setChannelNum(channelNum);
            appliancesInfo.setBigType(Configuration.CURTAIN_BIG_TYPE);
            appliancesInfo.setLittleType(littleType);
            appliancesInfo.setCtrlCommand(Configuration.CURTAIN_CTRL_COMMAND);
            appliancesInfo.setCtrlBackCommand(Configuration.CURTAIN_CTRL_BACK_COMMAND);
            appliancesInfo.setStateCommand(Configuration.CURTAIN_STATE_COMMAND);
            appliancesInfo.setStateBackCommand(Configuration.CURTAIN_STATE_BACK_COMMAND);
            appliancesInfo.setDeviceSubnetID(devicesData.getSourceSubnetID());
            appliancesInfo.setDeviceDeviceID(devicesData.getSourceDeviceID());
            appliancesInfo.setParentRemarks(parentRemarks);
            appliancesInfo.setPort(port);
            appliancesInfo.setIpAddress(ipAddress);
        }
    }

    private static void parseAirData(int littleType, AppliancesInfo appliancesInfo, DevicesData devicesData, String parentRemarks, int channelNum, int port, String ipAddress) {
        switch (littleType) {
            case 0:
                appliancesInfo.setDeviceName("HVAC 模块");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_AC_HVAC);
                break;
            case 1:
                appliancesInfo.setDeviceName("Coolmaster 控制模块");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_AC_COOLMASTER);
                break;
            case 2:
                appliancesInfo.setDeviceName("红外空调模块");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_AC_INFRARED);
                break;
            case 3:
                appliancesInfo.setDeviceName("通用空调面板");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_AC_PANEL);
                break;
            default:
                appliancesInfo.setDeviceName(Configuration.UNKNOW_TYPE);
                break;

        }
        if (devicesData != null) {
            appliancesInfo.setChannelNum(channelNum);
            appliancesInfo.setBigType(Configuration.AIR_BIG_TYPE);
            appliancesInfo.setLittleType(littleType);
            appliancesInfo.setDeviceSubnetID(devicesData.getSourceSubnetID());
            appliancesInfo.setDeviceDeviceID(devicesData.getSourceDeviceID());
            appliancesInfo.setParentRemarks(parentRemarks);
            appliancesInfo.setPort(port);
            appliancesInfo.setIpAddress(ipAddress);
            if (littleType == 0) {
                appliancesInfo.setCtrlCommand(Configuration.AIR_HVAC_CTRL_COMMAND);
                appliancesInfo.setCtrlBackCommand(Configuration.AIR_HVAC_CTRL_BACK_COMMAND);
//                appliancesInfo.setStateCommand(Configuration.AIR_HVAC_STATE_COMMAND);
                appliancesInfo.setStateBackCommand(Configuration.AIR_HVAC_STATE_BACK_COMMAND);
            } else {
                appliancesInfo.setCtrlCommand(Configuration.AIR_CTRL_COMMAND);
                appliancesInfo.setCtrlBackCommand(Configuration.AIR_CTRL_BACK_COMMAND);
                appliancesInfo.setStateCommand(Configuration.AIR_STATE_COMMAND);
                appliancesInfo.setStateBackCommand(Configuration.AIR_STATE_BACK_COMMAND);

            }


        }
    }

    private static void parseAudioData(int littleType, AppliancesInfo appliancesInfo, DevicesData devicesData, String parentRemarks, int channelNum, int port, String ipAddress) {
        switch (littleType) {
            case 0:
                appliancesInfo.setDeviceName("背景音乐模块");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_MUSIC_MODULE);
                break;
            case 1:
                appliancesInfo.setDeviceName("第三方背景音乐模块");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_MUSIC_THIRD_PARTY_MODULE);
                break;
            case 3:
                appliancesInfo.setDeviceName("2018新背景音乐模块");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_MUSIC_NEW_MODULE);
                break;
            default:
                break;
        }

        if (devicesData != null) {
            appliancesInfo.setChannelNum(channelNum);
            appliancesInfo.setBigType(Configuration.AUDIO_BIG_TYPE);
            appliancesInfo.setLittleType(littleType);
            appliancesInfo.setCtrlCommand(Configuration.AUDIO_CTRL_READ_COMMAND);
            appliancesInfo.setCtrlBackCommand(Configuration.AUDIO_CTRL_READ_BACK_COMMAND);
            appliancesInfo.setStateCommand(Configuration.AUDIO_MenuPlay_INSTRUCTION_COMMAND);
            appliancesInfo.setStateBackCommand(Configuration.AUDIO_MenuPlay_INSTRUCTION_BACK_COMMAND);
            appliancesInfo.setDeviceSubnetID(devicesData.getSourceSubnetID());
            appliancesInfo.setDeviceDeviceID(devicesData.getSourceDeviceID());
            appliancesInfo.setParentRemarks(parentRemarks);
            appliancesInfo.setPort(port);
            appliancesInfo.setIpAddress(ipAddress);
        }
    }

    private static void parseLogicData(int littleType, AppliancesInfo appliancesInfo, DevicesData devicesData, String parentRemarks, int channelNum, int port, String ipAddress) {
        switch (littleType) {
            case 0:
                appliancesInfo.setDeviceName("逻辑模块");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_LOGIC_MODULE);
                break;
            default:
                appliancesInfo.setDeviceName(Configuration.UNKNOW_TYPE);
                break;
        }

        if (devicesData != null) {
            appliancesInfo.setChannelNum(channelNum);
            appliancesInfo.setBigType(Configuration.LOGIC_BIG_TYPE);
            appliancesInfo.setLittleType(littleType);
            appliancesInfo.setCtrlCommand(Configuration.LOGIC_CTRL_COMMAND);
            appliancesInfo.setCtrlBackCommand(Configuration.LOGIC_CTRL_BACK_COMMAND);
            appliancesInfo.setStateCommand(Configuration.LOGIC_STATE_COMMAND);
            appliancesInfo.setStateBackCommand(Configuration.LOGIC_STATE_BACK_COMMAND);
            appliancesInfo.setDeviceSubnetID(devicesData.getSourceSubnetID());
            appliancesInfo.setDeviceDeviceID(devicesData.getSourceDeviceID());
            appliancesInfo.setParentRemarks(parentRemarks);
            appliancesInfo.setPort(port);
            appliancesInfo.setIpAddress(ipAddress);


        }
    }

    private static void parseGlobalLogicData(int littleType, AppliancesInfo appliancesInfo, DevicesData devicesData, String parentRemarks, int channelNum, int port, String ipAddress) {
        switch (littleType) {
            case 0:
                appliancesInfo.setDeviceName("全局逻辑模块");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_GLOBAL_LOGIC_MODULE);
                break;
            default:
                appliancesInfo.setDeviceName(Configuration.UNKNOW_TYPE);
                break;
        }

        if (devicesData != null) {
            appliancesInfo.setChannelNum(channelNum);
            appliancesInfo.setBigType(Configuration.GLOBAL_LOGIC_BIG_TYPE);
            appliancesInfo.setLittleType(littleType);
            appliancesInfo.setCtrlCommand(Configuration.LOGIC_CTRL_COMMAND);
            appliancesInfo.setCtrlBackCommand(Configuration.LOGIC_CTRL_BACK_COMMAND);
            appliancesInfo.setStateCommand(Configuration.LOGIC_STATE_COMMAND);
            appliancesInfo.setStateBackCommand(Configuration.LOGIC_STATE_BACK_COMMAND);
            appliancesInfo.setDeviceSubnetID(devicesData.getSourceSubnetID());
            appliancesInfo.setDeviceDeviceID(devicesData.getSourceDeviceID());
            appliancesInfo.setParentRemarks(parentRemarks);
            appliancesInfo.setPort(port);
            appliancesInfo.setIpAddress(ipAddress);


        }
    }


    private static void parseSensorData(int littleType, AppliancesInfo appliancesInfo, DevicesData devicesData, String parentRemarks, int curChannelNum, int port, String ipAddress) {
        switch (littleType) {
            case 0:
                appliancesInfo.setDeviceName("传感器 干结点");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_SENSOR_DRY_CONTACT);
                break;
            case 1:
                appliancesInfo.setDeviceName("传感器 移动探测");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_SENSOR_MOVEMENT_DETECTOR);
                break;
            case 2:
                appliancesInfo.setDeviceName("传感器 温度");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_SENSOR_TEMP);
                break;
            case 3:
                appliancesInfo.setDeviceName("传感器 湿度");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_SENSOR_HUMIDITY);
                break;
            case 4:
                appliancesInfo.setDeviceName("传感器 照度");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_SENSOR_ILLUMINACE);
                break;
            case 5:
                appliancesInfo.setDeviceName("传感器 VOC");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_SENSOR_VOC);
                break;
            case 6:
                appliancesInfo.setDeviceName("传感器 PM2.5");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_SENSOR_PM_2_POINT_5);
                break;
            case 7:
                appliancesInfo.setDeviceName("传感器 CO2");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_SENSOR_C02);
                break;
            case 8:
                appliancesInfo.setDeviceName("传感器 液化石油气");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_SENSOR_LPG);
                break;
            case 9:
                appliancesInfo.setDeviceName("传感器 人工煤气(CO,H2");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_SENSOR_CO_H2);
                break;
            case 10:
                appliancesInfo.setDeviceName("传感器 天然气(CH4)");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_SENSOR_CH4);
                break;
            case 11:
                appliancesInfo.setDeviceName("传感器 烟雾");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_SENSOR_SMOG);
                break;
            case 12:
                appliancesInfo.setDeviceName("传感器 风速");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_SENSOR_WIND_SPEED);
                break;
            case 13:
                appliancesInfo.setDeviceName("传感器 风压");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_SENSOR_WIND_PRESSURE);
                break;
            case 14:
                appliancesInfo.setDeviceName("传感器 液体流量");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_SENSOR_LIQUID_FLOW);
                break;
            case 15:
                appliancesInfo.setDeviceName("传感器 液体压力");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_SENSOR_LIQUID_PRESSURE);
                break;
            case 16:
                appliancesInfo.setDeviceName("传感器 液体深度 ");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_SENSOR_LIQUID_DEPTH);
                break;
            case 17:
                appliancesInfo.setDeviceName("传感器 雨量");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_SENSOR_RAIN_FALL);
                break;
            case 18:
                appliancesInfo.setDeviceName("传感器 重量");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_SENSOR_WEIGHT);
                break;
            case 19:
                appliancesInfo.setDeviceName("传感器 高度/长度");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_SENSOR_HEIGHT_LENGTH);
                break;
            case 20:
                appliancesInfo.setDeviceName("传感器 物体速度");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_SENSOR_OBJECT_SPEED);
                break;
            case 21:
                appliancesInfo.setDeviceName("传感器 震动");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_SENSOR_SHAKE);
                break;
            case 22:
                appliancesInfo.setDeviceName("传感器 电压");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_SENSOR_VOLTAGE);
                break;
            case 23:
                appliancesInfo.setDeviceName("传感器 电流");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_SENSOR_ELECTRICITY);
                break;
            case 24:
                appliancesInfo.setDeviceName("传感器 功率");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_SENSOR_POWER);
                break;


            default:
                appliancesInfo.setDeviceName(Configuration.UNKNOW_TYPE);
                break;
        }
        if (devicesData != null) {
            appliancesInfo.setChannelNum(curChannelNum);
            appliancesInfo.setBigType(Configuration.SENSOR_BIG_TYPE);
            appliancesInfo.setLittleType(littleType);
//            appliancesInfo.setCtrlCommand(Configuration.LOGIC_CTRL_COMMAND);
//            appliancesInfo.setCtrlBackCommand(Configuration.LOGIC_CTRL_BACK_COMMAND);
            appliancesInfo.setStateCommand(Configuration.SENSOR_STATE_COMMAND);
            appliancesInfo.setStateBackCommand(Configuration.SENSOR_STATE_BACK_COMMAND);
            appliancesInfo.setDeviceSubnetID(devicesData.getSourceSubnetID());
            appliancesInfo.setDeviceDeviceID(devicesData.getSourceDeviceID());
            appliancesInfo.setParentRemarks(parentRemarks);
            appliancesInfo.setPort(port);
            appliancesInfo.setIpAddress(ipAddress);


        }


    }


    /**
     *地热
     */
    private static void parseGeothermalData(int littleType, AppliancesInfo appliancesInfo, DevicesData devicesData, String parentRemarks, int channelNum, int port, String ipAddress) {
        switch (littleType) {
            case Configuration.GEOTHERMAL_LITTLE_TYPE_0:
                appliancesInfo.setDeviceName("地热模块");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_GEOTHERMAL_MODULE);
                break;
//            case 1:
//                appliancesInfo.setDeviceName("常规地热面板");
//                appliancesInfo.setDeviceType(HDLApConfig.TYPE_GEOTHERMAL_MODULE_PANEL);
//                break;
//            case 2:
//                appliancesInfo.setDeviceName("带PI运算的地热面板");
//                appliancesInfo.setDeviceType(HDLApConfig.TYPE_GEOTHERMAL_MODULE_PI);
//                break;
            default:
                appliancesInfo.setDeviceName(Configuration.UNKNOW_TYPE);
                break;

        }
        if (devicesData != null) {
            appliancesInfo.setChannelNum(channelNum);
            appliancesInfo.setBigType(Configuration.GEOTHERMAL_BIG_TYPE);
            appliancesInfo.setLittleType(littleType);
            appliancesInfo.setDeviceSubnetID(devicesData.getSourceSubnetID());
            appliancesInfo.setDeviceDeviceID(devicesData.getSourceDeviceID());
            appliancesInfo.setParentRemarks(parentRemarks);
            appliancesInfo.setPort(port);
            appliancesInfo.setIpAddress(ipAddress);

            appliancesInfo.setCtrlCommand(Configuration.GEOTHERMAL_MODULE_CTRL_COMMAND);
            appliancesInfo.setCtrlBackCommand(Configuration.GEOTHERMAL_MODULE_CTRL_BACK_COMMAND);
            appliancesInfo.setStateCommand(Configuration.GEOTHERMAL_MODULE_STATE_COMMAND);
            appliancesInfo.setStateBackCommand(Configuration.GEOTHERMAL_MODULE_STATE_BACK_COMMAND);

//            if (littleType == 1) {
//                appliancesInfo.setCtrlCommand(Configuration.GEOTHERMAL_MODULE_PANEL_CTRL_COMMAND);
//                appliancesInfo.setCtrlBackCommand(Configuration.GEOTHERMAL_MODULE_PANEL_CTRL_BACK_COMMAND);
//                appliancesInfo.setStateCommand(Configuration.GEOTHERMAL_MODULE_PANEL_STATE_COMMAND);
//                appliancesInfo.setStateBackCommand(Configuration.GEOTHERMAL_MODULE_PANEL_STATE_BACK_COMMAND);
//            } else if(littleType == 2) {
//                appliancesInfo.setCtrlCommand(Configuration.GEOTHERMAL_MODULE_PI_CTRL_COMMAND);
//                appliancesInfo.setCtrlBackCommand(Configuration.GEOTHERMAL_MODULE_PI_CTRL_BACK_COMMAND);
//                appliancesInfo.setStateCommand(Configuration.GEOTHERMAL_MODULE_PI_STATE_COMMAND);
//                appliancesInfo.setStateBackCommand(Configuration.GEOTHERMAL_MODULE_PI_STATE_BACK_COMMAND);
//
//            } else  {
//                appliancesInfo.setCtrlCommand(Configuration.GEOTHERMAL_MODULE_CTRL_COMMAND);
//                appliancesInfo.setCtrlBackCommand(Configuration.GEOTHERMAL_MODULE_CTRL_BACK_COMMAND);
//                appliancesInfo.setStateCommand(Configuration.GEOTHERMAL_MODULE_STATE_COMMAND);
//                appliancesInfo.setStateBackCommand(Configuration.GEOTHERMAL_MODULE_STATE_BACK_COMMAND);
//
//            }


        }
    }

    /**
     *  新风系统
     */
    private static void parseFreshAirData(int littleType, AppliancesInfo appliancesInfo, DevicesData devicesData, String parentRemarks, int channelNum, int port, String ipAddress) {
        switch (littleType) {
            case 0:
                appliancesInfo.setDeviceName("新风系统模块");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_FRESH_AIR);
                break;
            default:
                appliancesInfo.setDeviceName(Configuration.UNKNOW_TYPE);
                break;
        }

        if (devicesData != null) {
            appliancesInfo.setChannelNum(channelNum);
            appliancesInfo.setBigType(Configuration.FRESH_AIR_BIG_TYPE);
            appliancesInfo.setLittleType(littleType);
            appliancesInfo.setCtrlCommand(Configuration.FRESH_AIR_CTRL_COMMAND);
            appliancesInfo.setCtrlBackCommand(Configuration.FRESH_AIR_CTRL_BACK_COMMAND);
            appliancesInfo.setStateCommand(Configuration.FRESH_AIR_STATE_COMMAND);
            appliancesInfo.setStateBackCommand(Configuration.FRESH_AIR_STATE_BACK_COMMAND);
            appliancesInfo.setDeviceSubnetID(devicesData.getSourceSubnetID());
            appliancesInfo.setDeviceDeviceID(devicesData.getSourceDeviceID());
            appliancesInfo.setParentRemarks(parentRemarks);
            appliancesInfo.setPort(port);
            appliancesInfo.setIpAddress(ipAddress);


        }
    }


    /**
     *
     * @param bigType
     * @param littleType
     * @param mSubnetID
     * @param mDeviceID
     * @param parentRemarks
     * @return
     */
    public static DevicesData addDevicesManuallyWithoutSearchingAll(int bigType, int littleType, int mSubnetID, int mDeviceID, int port, String parentRemarks, ArrayList<String> parentRemarksList) {
        boolean bWantData = false;
        DevicesData devicesData = new DevicesData();
        devicesData.setSourceSubnetID(mSubnetID);
        devicesData.setSourceDeviceID(mDeviceID);
        devicesData.setRemark(parentRemarks);

        List<AppliancesInfo> appliancesInfoList = new ArrayList<>();
        if (isWantData(bigType, littleType)) {
            for(int i = 0; i<parentRemarksList.size();i++){
                appliancesInfoList.add( getDevicesInfo(devicesData, bigType, littleType,i+1, port, parentRemarks, parentRemarksList.get(i)));
            }
            bWantData = true;

//            HDLLog.I( "向模块添加回路:"+"大类:" + mBigType + " 小类:" + mLittleType +" 模块备注" + mRemarks );
        } else {
//            HDLLog.I( "不是要添加的设备:大类:" + mBigType + " 小类:" + mLittleType +" 模块备注" + mRemarks );
        }

        if (bWantData) {
            devicesData.setAppliancesInfoList(appliancesInfoList);
            devicesDataList.add(devicesData);

            HandleSearch.OnDeviceListGetSuccessCallBack();
        }else {
            devicesData = null;
        }

        return devicesData;
    }

    private static AppliancesInfo getDevicesInfo(DevicesData devicesData, int bigType, int littleType, int curChannelNum, int port, String parentRemarks, String mRemarks){
        AppliancesInfo appliancesInfo = new AppliancesInfo();
        /**根据类别,赋值操作码等一些重要信息*/
        switch (bigType) {
            case Configuration.LIGTH_BIG_TYPE:
                parseLightData(littleType, appliancesInfo, devicesData, parentRemarks, curChannelNum, port, "");
                break;
            case Configuration.CURTAIN_BIG_TYPE:
                parseCurtainData(littleType, appliancesInfo, devicesData, parentRemarks, curChannelNum, port, "");
                break;
            case Configuration.AIR_BIG_TYPE:
                parseAirData(littleType, appliancesInfo, devicesData, parentRemarks, curChannelNum, port, "");
                break;
            case Configuration.AUDIO_BIG_TYPE:
                parseAudioData(littleType, appliancesInfo, devicesData, parentRemarks, curChannelNum, port, "");
                break;
            case Configuration.LOGIC_BIG_TYPE:
                parseLogicData(littleType, appliancesInfo, devicesData, parentRemarks, curChannelNum, port, "");
                break;
            case Configuration.GLOBAL_LOGIC_BIG_TYPE:
                parseGlobalLogicData(littleType, appliancesInfo, devicesData, parentRemarks, curChannelNum, port, "");
                break;
            case Configuration.SENSOR_BIG_TYPE:
                parseSensorData(littleType, appliancesInfo, devicesData, parentRemarks, curChannelNum, port, "");
                break;
            //2019-07-08 新增地热和新风类
            case Configuration.GEOTHERMAL_BIG_TYPE://地热
                parseGeothermalData(littleType, appliancesInfo, devicesData, parentRemarks, curChannelNum, port, "");
                break;
            case Configuration.FRESH_AIR_BIG_TYPE:
                parseFreshAirData(littleType, appliancesInfo, devicesData, parentRemarks, curChannelNum, port, "");
                break;
            default:
//                            appliancesInfo.setDeviceName(Configuration.UNKNOW_TYPE);
                break;
        }


        String key = "K" + appliancesInfo.getBigType()
                + "-" + appliancesInfo.getLittleType()
                + "-" + appliancesInfo.getDeviceSubnetID()
                + "-" + appliancesInfo.getDeviceDeviceID()
                + "-" + appliancesInfo.getChannelNum();
        appliancesInfo.setRemarks(mRemarks);
        appliancesInfo.setDeviceKey(key);//2019-8-2 添加唯一标识key
        return appliancesInfo;

    }

    /**********************************************************以下代码为zigbee设备或场景返回对应Bus的转换*************************************************/
    /**
     * 获取到zigbee设备后生成对应的bus设备
     * 添加设备回路
     * 如果存在相同子网号 设备号,则当成混合模块添加到该回路下,不存在则新添加模块
     * @param bigType 大类
     * @param littleType 小类
     * @param mSubnetID 子网号
     * @param mDeviceID 设备号
     * @param mChannelNum 回路号
     * @param mChannelRemark 回路设备名称
     * @param parentRemarks 设备名称
     * @param bSaveAndCallBack 是否马上保存本地并且推送DevicesInfoEvent 事件
     * @return
     */
    public static DevicesData addDevicesListWithoutSearching(int bigType, int littleType, int mSubnetID, int mDeviceID, int mChannelNum, String mChannelRemark, String parentRemarks, boolean bSaveAndCallBack) {
//        boolean bWantData = false;
        if (isWantData(bigType, littleType)) {
            DevicesData devicesData = new DevicesData();
            devicesData.setSourceSubnetID(mSubnetID);
            devicesData.setSourceDeviceID(mDeviceID);
            devicesData.setRemark(parentRemarks);

            Boolean isFindDevicesData = false;
            int index = 0;
            for (int i = 0; i < devicesDataList.size(); i++) {
                if (devicesDataList.get(i).getSourceSubnetID() == mSubnetID && devicesDataList.get(i).getSourceDeviceID() == mDeviceID) {
                    index = i;
                    isFindDevicesData = true;
                    break;
                }
            }

            if (isFindDevicesData) {
              /*  AppliancesInfo mAppliancesInfo = getDevicesInfo1(devicesData, bigType, littleType, mChannelNum, parentRemarks, mChannelRemark);
                devicesDataList.get(index).getAppliancesInfoList().add(mAppliancesInfo);
                devicesData = devicesDataList.get(index);*/
                if(bSaveAndCallBack){
                    HandleSearch.OnDeviceListGetSuccessCallBack();}
            } else {
                List<AppliancesInfo> appliancesInfoList = new ArrayList<>();
                appliancesInfoList.add(getDevicesInfo1(devicesData, bigType, littleType, mChannelNum, parentRemarks, mChannelRemark));
                devicesData.setAppliancesInfoList(appliancesInfoList);
                devicesDataList.add(devicesData);
                if(bSaveAndCallBack){
                    HandleSearch.OnDeviceListGetSuccessCallBack();}

            }

            return devicesData;

        } else {
            return null;

        }


    }


    /**
     * 获取到zigbee场景后生成对应的bus场景
     * 添加场景设备回路
     * 如果存在相同子网号 设备号,则当成混合模块添加到该回路下,不存在则新添加模块
     * @param mSubnetID
     * @param mDeviceID
     * @param mAreaNum //场景 区域号
     * @param mAreaSceneNum //场景 当前区域场景号
     * @param mChannelRemark
     * @param parentRemarks
     * @param bSaveAndCallBack 是否马上保存本地并且推送DevicesInfoEvent 事件
     * @return
     */
    public static DevicesData addScenesDevicesListWithoutSearching(int mSubnetID, int mDeviceID, int mAreaNum, int mAreaSceneNum, String mChannelRemark, String parentRemarks, boolean bSaveAndCallBack) {
//        boolean bWantData = false;

        int bigType = Configuration.GLOBAL_LOGIC_BIG_TYPE;
        int littleType = 0;
        if (isWantData(bigType, littleType)) {
            DevicesData devicesData = new DevicesData();
            devicesData.setSourceSubnetID(mSubnetID);
            devicesData.setSourceDeviceID(mDeviceID);
            devicesData.setRemark(parentRemarks);

            Boolean isFindDevicesData = false;
            int index = 0;
            for (int i = 0; i < devicesDataList.size(); i++) {
                if (devicesDataList.get(i).getSourceSubnetID() == mSubnetID && devicesDataList.get(i).getSourceDeviceID() == mDeviceID) {
                    index = i;
                    isFindDevicesData = true;
                    break;
                }
            }
            if (isFindDevicesData) {
            /*    AppliancesInfo mAppliancesInfo = getDevicesInfo1(devicesData, bigType, littleType, mAreaNum, parentRemarks, mChannelRemark);
                LogicMode mLogicMode = new LogicMode();
                mLogicMode.setAreaNum(mAreaNum);
                mLogicMode.setAreaSceneNum(mAreaSceneNum);
                mAppliancesInfo.setLogicMode(mLogicMode);
                devicesDataList.get(index).getAppliancesInfoList().add(mAppliancesInfo);
                devicesData = devicesDataList.get(index);*/
                if(bSaveAndCallBack){
                    HandleSearch.OnDeviceListGetSuccessCallBack();}
            } else {
                List<AppliancesInfo> appliancesInfoList = new ArrayList<>();
                AppliancesInfo mAppliancesInfo = getDevicesInfo1(devicesData, bigType, littleType, mAreaNum, parentRemarks, mChannelRemark);
                LogicMode mLogicMode = new LogicMode();
                mLogicMode.setAreaNum(mAreaNum);
                mLogicMode.setAreaSceneNum(mAreaSceneNum);
                mAppliancesInfo.setLogicMode(mLogicMode);
                appliancesInfoList.add(mAppliancesInfo);
                devicesData.setAppliancesInfoList(appliancesInfoList);
                devicesDataList.add(devicesData);
                if(bSaveAndCallBack){
                    HandleSearch.OnDeviceListGetSuccessCallBack();}
            }
            return devicesData;

        } else {
            return null;

        }
    }

    public static AppliancesInfo getDevicesInfo1(DevicesData devicesData, int bigType, int littleType, int curChannelNum, String parentRemarks, String mRemarks) {
        AppliancesInfo appliancesInfo = new AppliancesInfo();
        /**根据类别,赋值操作码等一些重要信息*/
        switch (bigType) {
            case Configuration.LIGTH_BIG_TYPE:
                parseLightData(littleType, appliancesInfo, devicesData, parentRemarks, curChannelNum, 0, "");
                break;
            case Configuration.CURTAIN_BIG_TYPE:
                parseCurtainData(littleType, appliancesInfo, devicesData, parentRemarks, curChannelNum, 0, "");
                break;
            case Configuration.AIR_BIG_TYPE:
                parseAirData(littleType, appliancesInfo, devicesData, parentRemarks, curChannelNum, 0, "");
                break;
            case Configuration.AUDIO_BIG_TYPE:
                parseAudioData(littleType, appliancesInfo, devicesData, parentRemarks, curChannelNum, 0, "");
                break;
            case Configuration.LOGIC_BIG_TYPE:
                parseLogicData(littleType, appliancesInfo, devicesData, parentRemarks, curChannelNum, 0, "");
                break;
            case Configuration.GLOBAL_LOGIC_BIG_TYPE:
                parseGlobalLogicData(littleType, appliancesInfo, devicesData, parentRemarks, curChannelNum, 0, "");
                break;
            case Configuration.SENSOR_BIG_TYPE://2019-07-03 屏蔽
                parseSensorData(littleType, appliancesInfo, devicesData, parentRemarks, curChannelNum, 0, "");
                break;
            case Configuration.GEOTHERMAL_BIG_TYPE://地热
                parseGeothermalData(littleType, appliancesInfo, devicesData, parentRemarks, curChannelNum, 0, "");
                break;
            case Configuration.FRESH_AIR_BIG_TYPE:
                parseFreshAirData(littleType, appliancesInfo, devicesData, parentRemarks, curChannelNum, 0, "");
                break;

            default:
//                            appliancesInfo.setDeviceName(Configuration.UNKNOW_TYPE);
                break;
        }

        String key = "K" + appliancesInfo.getBigType()
                + "-" + appliancesInfo.getLittleType()
                + "-" + appliancesInfo.getDeviceSubnetID()
                + "-" + appliancesInfo.getDeviceDeviceID()
                + "-" + appliancesInfo.getChannelNum();
        appliancesInfo.setRemarks(mRemarks);
        appliancesInfo.setDeviceKey(key);//2019-8-2 添加唯一标识key
        return appliancesInfo;

    }

}