package org.wcs.plugin.lxLed.model;

import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import org.wcs.plugin.lxLed.enums.TextColorEnum;
import org.wcs.plugin.lxLed.enums.TextEffectEnum;
import org.wcs.utils.AppListUtils;
import org.wcs.utils.AppStringUtils;
import org.wcs.utils.Converter;

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

/**
 * 灵信LED屏每个区域的数据
 */
@Getter
@Setter
@Builder
public class LedAreaData {

    /**
     * 区域的起始X坐标
     */
    private short startX;

    /**
     * 区域的起始Y坐标
     */
    private short startY;

    /**
     * 区域的结束X坐标
     */
    private short endX;

    /**
     * 区域的结束Y坐标
     */
    private short endY;

    /**
     * 区域的文字颜色
     */
    @Builder.Default
    private TextColorEnum textColor = TextColorEnum.RED;

    /**
     * 区域的文字效果
     */
    @Builder.Default
    private TextEffectEnum textEffect = TextEffectEnum.SHOW_IMMEDIATELY;

    /**
     * 区域的文字效果速度，越小越快，范围 1-64
     */
    @Builder.Default
    private byte effectSpeed = 10;

    /**
     * 区域的文字每页显示时间
     */
    @Builder.Default
    private short showTime = 2;

    /**
     * 区域的文字大小
     */
    @Builder.Default
    private byte textSize = 12;

    /**
     * 区域的文字内容
     */
    private String text;

    /**
     * 创建区域数据
     * @return 区域数据
     */
    public List<Byte> create() {
        List<Byte> bytes = new ArrayList<>();
        // 区域用途
        bytes.add((byte) 1);
        // 区域数据大小 ---- 先临时赋值
        bytes.add((byte) 0);
        bytes.add((byte) 0);
        bytes.add((byte) 0);
        bytes.add((byte) 0);
        // 区域类型
        bytes.add((byte) 0x0E);
        // 坐标
        bytes.addAll(AppListUtils.transfer(Converter.toBytes(startX)).reversed());
        bytes.addAll(AppListUtils.transfer(Converter.toBytes(startY)).reversed());
        bytes.addAll(AppListUtils.transfer(Converter.toBytes(endX)).reversed());
        bytes.addAll(AppListUtils.transfer(Converter.toBytes(endY)).reversed());
        // 文字颜色
        bytes.add((byte) textColor.getValue());
        bytes.add((byte) 0);
        bytes.add((byte) 0);
        bytes.add((byte) 0);
        // 文字效果
        bytes.add((byte) textEffect.getCode());
        // 效果速度
        bytes.add(effectSpeed);
        // 显示时间
        bytes.addAll(AppListUtils.transfer(Converter.toBytes(showTime)).reversed());
        // 文字大小
        bytes.add(textSize);
        // 文本字符串
        byte[] byteArrayGBK = AppStringUtils.toByteArrayGBK(text);
        if (byteArrayGBK != null) {
            // 文本字符串字节数
            bytes.addAll(AppListUtils.transfer(Converter.toBytes(byteArrayGBK.length)).reversed());
            // 文本字符串字节
            bytes.addAll(AppListUtils.transfer(byteArrayGBK).reversed());
        }
        int bytesLength = bytes.size();
        byte[] bytesLengthBytes = Converter.toBytes(bytesLength);
        bytes.set(1, bytesLengthBytes[3]);
        bytes.set(2, bytesLengthBytes[2]);
        bytes.set(3, bytesLengthBytes[1]);
        bytes.set(4, bytesLengthBytes[0]);
        return bytes;
    }


}
