package org.wcs.business.etag;


import org.wcs.constant.enums.etag.LedBlinkingEnum;
import org.wcs.constant.enums.etag.LedColorEnum;
import org.wcs.utils.AppStringUtils;
import org.wcs.utils.Converter;

import java.util.Arrays;

/**
 * 电子标签的指令集
 */
public class EtagInstruction {

    /**
     * 标签自检
     * @return 命令字节数组
     * @remark 向控制器发送此命令将强制标签自检（测试通过）
     */
    public static byte[] checkAllTag() {
        byte[] data = new byte[7];
        data[0] = 7;
        data[1] = 0;
        data[2] = 0x60;
        data[6] = 0x09;
        return data;
    }

    /**
     * 显示标签ID
     * @param tagId 标签号
     * @return 命令字节数组
     * @remark 向控制器的某一个标签发送此命令将显示标签ID（测试通过）
     */
    public static byte[] showTagId(byte tagId) {
        byte[] data = new byte[8];
        data[0] = 8;
        data[1] = 0;
        data[2] = 0x60;
        data[6] = 0x13;
        data[7] = tagId;
        return data;
    }

    /**
     * 重启标签
     * @param tagId 标签号
     * @return 命令字节数组
     * @remark 向控制器的某一个标签发送此命令将重启标签（未测试）
     */
    public static byte[] restartTag(byte tagId) {
        byte[] data = new byte[8];
        data[0] = 8;
        data[1] = 0;
        data[2] = 0x60;
        data[6] = 0x14;
        data[7] = tagId;
        return data;
    }

    /**
     * 关闭标签
     * @param tagId 标签号
     * @return 命令字节数组
     * @remark 向控制器的某一个标签发送此命令将关闭标签（测试通过）
     */
    public static byte[] turnOffTag(byte tagId) {
        byte[] data = new byte[8];
        data[0] = 8;
        data[1] = 0;
        data[2] = 0x60;
        data[6] = 1;
        data[7] = tagId;
        return data;
    }

    /**
     * 设置标签颜色
     * @param tagId 标签号
     * @param ledColor 颜色
     * @return 命令字节数组
     * @remark 向控制器的某一个标签发送此命令将设置标签颜色（测试通过）
     */
    public static byte[] setLedColor(byte tagId, LedColorEnum ledColor) {
        byte[] data = new byte[10];
        data[0] = 0x0A;
        data[1] = 0;
        data[2] = 0x60;
        data[6] = 0x1F;
        data[7] = tagId;
        data[8] = 0;
        data[9] = ledColor.getCode().byteValue();
        return data;
    }

    /**
     * 设置LED闪烁模式
     * @param tagId 标签号
     * @param ledBlinkingEnum 闪烁模式
     * @return 命令字节数组
     * @remark 向控制器的某一个标签发送此命令将设置LED闪烁模式（测试通过）
     */
    public static byte[] setLedBlinking(byte tagId, LedBlinkingEnum ledBlinkingEnum) {
        byte[] data = new byte[10];
        data[0] = 0x0A;
        data[1] = 0;
        data[2] = 0x60;
        data[6] = 0x1F;
        data[7] = tagId;
        data[8] = 4;
        data[9] = ledBlinkingEnum.getCode().byteValue();
        return data;
    }

    /**
     * 显示数字
     * @param tagId 标签号
     * @param number 显示的数字
     * @return 命令字节数组
     * @remark 向控制器的某一个标签发送此命令将显示数字（三位标签测试通过，其他未测试）
     */
    public static byte[] showNumber6(byte tagId, String number) {
         if(AppStringUtils.isEmpty(number.trim())) {
            return turnOffTag(tagId);
        }
        if(!AppStringUtils.isNumber(number.trim())) {
            number = "ERR";
        }
        if(number.length() < 6) {
            number = AppStringUtils.padLeft(number, " ", 6);
        }
        else {
            number = number.substring(0, 6);
        }
        byte[] data = new byte[15];
        data[0] = 0x0f;
        data[1] = 0;
        data[2] = 0x60;
        data[6] = 0x00;
        data[7] = tagId;
        for (int i = 0; i < number.length(); i++) {
            char c = number.charAt(i);
            if(c == ' ') {
                continue;
            }
            data[8 + i] = (byte)c;
        }
        data[14] = 0x00;
        return data;
    }

    /**
     * 点亮巷道灯
     * @param tagId 标签号
     * @param value 显示的数字
     * @return 命令字节数组
     * @remark （测试通过）
     */
    public static byte[] light(byte tagId, String value) {
        byte[] data = new byte[17];
        data[0] = 0x11;
        data[1] = 0;
        data[2] = 0x61;
        data[3] = 0;
        data[4] = 0;
        data[5] = 0;
        data[6] = 0x41;
        data[7] = tagId;
        data[8] = 0;
        data[9] = 0;
        String lightStatus = "00010001"; // 默认常亮绿色
        if(AppStringUtils.isNotEmpty(value)) {
            lightStatus = value;
        }
        //data[9] = Converter.toByte(lightStatus);
        data[10] = Converter.toByte(lightStatus);
        data[11] = 0;
        data[12] = 0;
        data[13] = 0;
        data[14] = 0;
        data[15] = 0;
        data[16] = 0;
        return data;
    }

    /**
     * 点亮英文数字标签
     * @param tagId 标签号
     * @param value 显示的字符串
     * @return 消息字节
     */
    public static byte[] showEnglishString12(byte tagId, String value) {
         if(AppStringUtils.isEmpty(value.trim())) {
            return turnOffTag(tagId);
        }
        byte[] data = new byte[20];
        data[0] = 0x0f;
        data[1] = 0;
        data[2] = 0x60;
        data[3] = 0x0f;
        data[4] = 0;
        data[5] = 0;
        data[6] = 0;
        data[7] = tagId;
        for (int i = 0; i < value.length(); i++) {
            char c = value.charAt(i);
            if(c == ' ') {
                continue;
            }
            data[8 + i] = (byte)c;
        }
        return data;
    }


    /**
     * 设置中文数字标签的中文 ---- 调用 showChineseNumber6 显示数字才会显示
     * @param tagId 标签ID
     * @param chinese 中文
     * @return 消息字节
     * @remark （测试通过）
     */
    public static byte[] setChineseString(byte tagId, String chinese) {
        if(AppStringUtils.isEmpty(chinese.trim())) {
            return turnOffTag(tagId);
        }
        byte[] result = AppStringUtils.toByteArrayGBK(chinese);
        if (result != null && result.length > 48) {
            result = Arrays.copyOf(result, 48);
        }
        if(result != null) {
            byte[] data = new byte[0x0a + (byte)result.length];
            data[0] = (byte) (0x0a + (byte)result.length);
            data[1] = 0;
            data[2] = 0x60;
            data[3] = 0;
            data[4] = 0;
            data[5] = 0;
            data[6] = 0x39;
            data[7] = tagId;
            data[8] = 0x0c;
            System.arraycopy(result, 0, data, 9, result.length);
            return data;
        }
        return new byte[0];
    }

    /**
     * 清理中文标签缓存
     * @param tagId 标签ID
     * @return 结果
     */
    public static byte[] cleanChineseString(byte tagId) {
        byte[] data = new byte[8];
        data[0] = (byte)8;
        data[1] = 0;
        data[2] = 0x60;
        data[3] = 0;
        data[4] = 0;
        data[5] = 0;
        data[6] = 0x01;
        data[7] = tagId;
        return data;
    }

    /**
     * 显示中文标签的数字 ---- 调用此方法才会显示
     * @param tagId 标签ID
     * @param number 数字
     * @return 命令字节
     * @remark （测试通过）
     */
    public static byte[] showChineseNumber6(byte tagId, String number) {
        if(AppStringUtils.isEmpty(number.trim())) {
            return turnOffTag(tagId);
        }
        if(!AppStringUtils.isNumber(number.trim())) {
            number = "ERR";
        }
        if(number.length() < 6) {
            number = AppStringUtils.padLeft(number, "0", 6);
        }
        else {
            number = number.substring(0, 6);
        }
        byte[] data = new byte[14];
        data[0] = 0x0e;
        data[1] = 0;
        data[2] = 0x60;
        data[3] = 0;
        data[4] = 0;
        data[5] = 0;
        data[6] = 0x00;
        data[7] = tagId;
        for (int i = 0; i < number.length(); i++) {
            char c = number.charAt(i);
            if(c == ' ') {
                continue;
            }
            data[8 + i] = (byte)c;
        }
        return data;
    }
}
