package cn.estsh.i3plus.ext.mes.pcn.apiservice.util.reader;

import lombok.Data;

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

/**
 * @author ns
 * @create 2022/1/11 0011 下午 17:08
 * // 读取数据
 * //  40        0c        ec       01       cb9f      03      00          01             00 00 00 00           59
 * //固定长度   包有效长度   命令码   命令参数1    标签      数据区   起始地址   一个字节数据长度    accessPassword密码     Check Sum
 * //读取数据
 * //    byte[] chTemp = new byte[]{0x40, 0x0c, (byte) 0xec,  , (byte) 0xcb, (byte) 0x9f,0x03,0x00,0x01,0x00,0x00,0x00,0x00,0x59};
 */
@Data
public class CommandReadTag extends IBaseCommandParam {

    /**
     * 一个字节EPC位数L，说明EPC号的Word数目
     * 默认 0x01
     */
    private Byte digit;

    /**
     * L*2个字节EPC号，说明向哪个标签写数据
     */
    private Byte[] tags;

    /**
     * 内存区域
     * 0	密码区
     * 1	EPC号
     * 2	TID标签ID号
     * 3	用户区User  默认
     */
    private Byte mem;

    /**
     * 起始的地址
     */
    private Byte addr;

    /**
     * 一个字节数据长度len(单位:Word)
     */
    private Byte len;

    /**
     * 四个字节AccessPassword，密码
     * 默认 0x00 0x00 0x00 0x00
     */
    private Byte[] accessPassword;


    public CommandReadTag(Byte[] tags) {
        if (null == tags) {
            tags = new Byte[]{};
        }
        byte tempDigit = (byte) (tags.length / 2);
        this.digit = tempDigit;
        this.tags = tags;
        this.mem = ReaderConstWords.DEFAULT_DATA_AREA;
        this.addr = ReaderConstWords.BYTE_ZERO;
        this.len = ReaderConstWords.BYTE_ONE;
        this.accessPassword = ReaderConstWords.DEFAULT_ACCESS_PASSWORD;
    }

    public CommandReadTag(Byte[] tags, byte mem) {
        if (null == tags) {
            tags = new Byte[]{};
        }
        byte tempDigit = (byte) (tags.length / 2);
        this.digit = tempDigit;
        this.tags = tags;
        this.mem = mem;
        this.addr = ReaderConstWords.BYTE_ZERO;
        this.len = ReaderConstWords.BYTE_ONE;
        this.accessPassword = ReaderConstWords.DEFAULT_ACCESS_PASSWORD;
    }


    /**
     * 把当前实现的接口属性转换成 byte数组,也可以用反射，但是当前参数长度固定的话可以不用反射
     *
     * @return
     */
    @Override
    public List<Byte> toByteList() {
        List<Byte> byteList = new ArrayList<Byte>();
        byteList.add(this.digit);
        byteList.addAll(Arrays.asList(this.tags));
        byteList.add(this.mem);
        byteList.add(this.addr);
        byteList.add(this.len);
        byteList.addAll(Arrays.asList(this.accessPassword));
        return byteList;
    }

    /**
     * 获取包的有效长度
     * 4位固定长度，加上可变长度
     * @return
     */
    @Override
    public int getLength() {
        return 4 + this.tags.length + this.accessPassword.length;
    }

}
