package com.chinaitop.depot.intelligent.utils;

import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

/**
 * @author qingsong.han
 * @description: 常量类
 * 7E 000D 00 00 01 3132330000 3232323232 02 01 00
 * 7E是起始标志；
 * 000D=0X0005=5是报文体长度
 * 00是TYPE类型，
 * 00 01是分包相关的
 * 3132330000是仓房号
 * 3232323232设备编号
 * 02设备类型
 * 01动作类型
 * 00空调设置
 * byte[] cmd={0x7E,0x00,0x05,0x01,0x00,0x01,0x31,0x32,0x33,0x00,0x00}
 * @create 2019-01-15 19:59
 */
@Component
@SuppressWarnings("all")
public class ConstUtils {

    /**
     * 起始标志
     */
    public static final String HEADER = "7E";
    /**
     * 报文体长度13
     */
    public static final String EXTENT = "000D";
    // 报文体长度5
    public static final String F_EXTENT = "0005";
    // 所有仓房
    public static final String ALL_STORE = "0000000000";
    /**
     * 分包相关的
     */
    public static final String SUB_P = "0001";
    // 粮情分包
    public static final String F_SUB_P = "0101";
    /**
     * TYPE类型
     */
    // 0X00 远程控制。平台向设备管理系统发送控制指令
    public static final String RC_TYPE = "00";
    // 0X01 气体数据采集。平台向设备管理系统发送数据采集指令
    public static final String GAS_TYPE = "01";
    // 0X02 粮情数据采集
    public static final String GRAIN_TYPE = "02";
    // 0X0E 水分数据采集
    public static final String DEW_TYPE = "0E";
    // 0X03 获取设备状态
    public static final String EQS_TYPE = "03";
    // 0X04 油情数据采集
    public static final String OIL_TYPE = "04";
    // 0X05 获取氮气气调
    public static final String NITR_TYPE = "05";
    // 0X06 获取气象站数据
    public static final String WEAT_TYPE = "06";
    // 0X07 获取虫情
    public static final String WORM_TYPE = "07";
    // 0X08 获取多通道气体
    public static final String MGAS_TYPE = "08";
    // 0X09 获取空调数据
    public static final String TCL_TYPE = "09";
    // 0X0A 获取能耗数据
    public static final String ENER_TYPE = "0A";
    // 0X0B 获取照明
    public static final String ILLUM_TYPE = "0B";
    // 0X0C 获取制氮机数据
    public static final String HTN_TYPE = "0C";

    /**
     * DEVTYPE类型
     * 0：失败；1：成功；2：设备通讯异常；3：设备故障；4：未知原因
     */
    // 0X00 所有
    public static final String ALL_DEVTYPE = "00";
    // 0X01 通风窗
    public static final String TFC_DEVTYPE = "01";
    // 0X02 轴流窗
    public static final String ZLC_DEVTYPE = "02";
    // 0X03 轴流风机
    public static final String ZLFJ_DEVTYPE = "03";
    // 0X04 通风口
    public static final String TFK_DEVTYPE = "04";
    // 0X05 环流风机
    public static final String HLFJ_DEVTYPE = "05";
    // 0X06 离心风机
    public static final String LXFJ_DEVTYPE = "06";
    // 0X08 空调
    public static final String AIR_DEVTYPE = "08";
    // 0X09 照明
    public static final String ZM_DEVTYPE = "09";
    // 0X0A 数量监测
    public static final String SLJC_DEVTYPE = "0A";
    /**
     * ACTTYPE类型
     */
    // 0X00 关闭
    public static final String CLOSE_DEVTYPE = "00";
    // 0X01 打开（正转）
    public static final String OPEN_DEVTYPE = "01";
    // 0X02 反转（用于混流）
    public static final String REV_DEVTYPE = "02";
    // 0X03 停止（需设备支持）
    public static final String STOP_DEVTYPE = "03";
    // 0X10 设置空调温度
    public static final String TEMP_DEVTYPE = "10";
    // 0X11 设置空调模式
    public static final String MODE_DEVTYPE = "11";
    // 0X12 设置空调风速
    public static final String WIND_DEVTYPE = "12";

    /**
     * 拼接16进制指令
     * 7E 000D 00 00 01 3132330000 3232323232 02 01 00
     * 7E是起始标志 -->固定
     * 000D=0X0005=5是报文体长度 -->固定
     * 00是TYPE类型 -->str1
     * 00 01是分包相关的 -->固定
     * 3132330000是仓房号 -->str2
     * 3232323232设备编号 -->str3
     * -------------------------
     * 02设备类型 -->str4
     * 01动作类型 -->str5
     * 00空调设置 -->str6
     */
    public static String directiveJoint(String str1, String str2, String str3) {
        StringBuffer buffered = new StringBuffer();
        buffered.append(HEADER); // 起始标志
        buffered.append(EXTENT); // 报文体长度
        if (StringUtils.isNotBlank(str1)) // TYPE类型
            buffered.append(str1);
        buffered.append(SUB_P); // 分包相关的
        if (StringUtils.isNotBlank(str2)) { // 仓房编码补齐0x00
            if (str2.length() == 5)
                buffered.append(HexConvertUtils.strConvertHex(str2));
            else if (str2.length() == 4)
                buffered.append(HexConvertUtils.strConvertHex(str2) + "00");
            else if (str2.length() == 3)
                buffered.append(HexConvertUtils.strConvertHex(str2) + "0000");
            else if (str2.length() == 2)
                buffered.append(HexConvertUtils.strConvertHex(str2) + "000000");
            else if (str2.length() == 1)
                buffered.append(HexConvertUtils.strConvertHex(str2) + "00000000");
        }
        if (StringUtils.isNotBlank(str3)) { // 设备编号:不足低位补0X00，若为0，则控全部
            if (str3.length() == 5)
                buffered.append(HexConvertUtils.strConvertHex(str3));
            else if (str3.length() == 4)
                buffered.append(HexConvertUtils.strConvertHex(str3) + "00");
            else if (str3.length() == 3)
                buffered.append(HexConvertUtils.strConvertHex(str3) + "0000");
            else if (str3.length() == 2)
                buffered.append(HexConvertUtils.strConvertHex(str3) + "000000");
            else if (str3.length() == 1)
                buffered.append(HexConvertUtils.strConvertHex(str3) + "00000000");
        }
        return buffered.toString().trim();
    }
    public static String directiveJoint(String str1, String str2, String str3, String str4, String str5, String str6) {
        StringBuffer buffered = new StringBuffer();
        buffered.append(directiveJoint(str1, str2, str3));
        if (StringUtils.isNotBlank(str4)) // DEVTYPE设备类型
            buffered.append(str4);
        if (StringUtils.isNotBlank(str5)) // ACTTYPE动作类型
            buffered.append(str5);
        if (StringUtils.isNotBlank(str6) && str4.equals("08")) // KTPARA空调设置:当DEVTYPE为0X08有效
            buffered.append(str6);
        return buffered.toString().trim();
    }

    /**
     * 粮情
     * 拼接16进制指令
     * 7E 000D 00 00 01 3132330000 3232323232 02 01 00
     * 7E是起始标志 -->固定
     * 000D=13, 0X0005=5是报文体长度 -->extent
     * 00是TYPE类型 -->str1
     * 00 01是分包相关的 -->固定
     * 3132330000是仓房号 -->str2
     * 3232323232设备编号 -->str3
     * -------------------------
     * 02设备类型 -->str4
     * 01动作类型 -->str5
     * 00空调设置 -->str6
     */
    public static String directiveJoint(String extent, String sub, String str1, String str2, String str3) {
        StringBuffer buffered = new StringBuffer();
        buffered.append(HEADER); // 起始标志
        buffered.append(extent); // 报文体长度
        if (StringUtils.isNotBlank(str1)) // TYPE类型
            buffered.append(str1);
        buffered.append(sub); // 分包相关的
        if (StringUtils.isNotBlank(str2)) { // 仓房编码补齐0x00
            if (str2.length() == 5)
                buffered.append(HexConvertUtils.strConvertHex(str2));
            else if (str2.length() == 4)
                buffered.append(HexConvertUtils.strConvertHex(str2) + "00");
            else if (str2.length() == 3)
                buffered.append(HexConvertUtils.strConvertHex(str2) + "0000");
            else if (str2.length() == 2)
                buffered.append(HexConvertUtils.strConvertHex(str2) + "000000");
            else if (str2.length() == 1)
                buffered.append(HexConvertUtils.strConvertHex(str2) + "00000000");
        }
        if (StringUtils.isNotBlank(str3)) { // 设备编号:不足低位补0X00，若为0，则控全部
            if (str3.length() == 5)
                buffered.append(HexConvertUtils.strConvertHex(str3));
            else if (str3.length() == 4)
                buffered.append(HexConvertUtils.strConvertHex(str3) + "00");
            else if (str3.length() == 3)
                buffered.append(HexConvertUtils.strConvertHex(str3) + "0000");
            else if (str3.length() == 2)
                buffered.append(HexConvertUtils.strConvertHex(str3) + "000000");
            else if (str3.length() == 1)
                buffered.append(HexConvertUtils.strConvertHex(str3) + "00000000");
        }
        return buffered.toString().trim();
    }

    //氮气房操作--跟别的有区别

    /**
     * 拼接16进制指令
     * 7E 000D 00 00 01
     * 7E是起始标志 -->固定
     * 000D=0X0005=5是报文体长度 -->固定
     * 00是TYPE类型 -->str1
     * 00 01是分包相关的 -->固定
     */
    public static String directiveJoint(String str1) {
        StringBuffer buffered = new StringBuffer();
        buffered.append(HEADER); // 起始标志
        buffered.append(EXTENT); // 报文体长度
        if (StringUtils.isNotBlank(str1)) // TYPE类型
            buffered.append(str1);
        buffered.append(SUB_P); // 分包相关的
        return buffered.toString().trim();
    }
}
