package org.wcs.business.etag;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.wcs.business.redis.EtagRedis;
import org.wcs.constant.enums.database.ETagTypeEnum;
import org.wcs.constant.enums.etag.LedBlinkingEnum;
import org.wcs.constant.enums.etag.LedColorEnum;
import org.wcs.model.bo.etag.EtagLightParams;
import org.wcs.model.po.app.AppEtagTagInfo;

/**
 * 上尚电子标签操作类
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class EtagAtopOperation {

    // 电子标签 redis 操作类
    private final EtagRedis etagRedis;

    /**
     * 点亮标签
     * @param params 点亮标签参数
     * @return 结果
     */
    public String lightTag(EtagLightParams params) {
        if(params == null || params.getTagName() == null) {
            return "参数错误";
        }
        if(EtagCommon.socketClient == null) {
            return "电子标签控制器尚未初始化";
        }
        AppEtagTagInfo etagTag = etagRedis.getEtagTag(params.getTagName());
        if(etagTag == null) {
            return "未找到标签";
        }
        Integer tagId = etagTag.getTagId();
        if(tagId == null || tagId < 0 || tagId > 127) {
            return "标签ID格式不正确";
        }
        params.setTagId(tagId.byteValue()); // 设置标签ID进参数
        Integer controllerId = etagTag.getControllerId(); // 控制器ID，也是 Socket 连接的 ID
        ETagTypeEnum eTagTypeEnum = ETagTypeEnum.getByCode(etagTag.getTagType());
        if(eTagTypeEnum == null) {
            return "未知标签种类";
        }
        switch (eTagTypeEnum) {
            case ETagTypeEnum.NUMBER_BUTTON_3 -> {
                return lightNumberButton3(controllerId, params);
            }
            case ETagTypeEnum.NUMBER_BUTTON_7 -> {
                return lightNumberButton7(controllerId, params);
            }
            case ETagTypeEnum.NUMBER_ENGLISH_BUTTON_12 -> {
                return lightNumberEnglishButton12(controllerId, params);
            }
            case ETagTypeEnum.NUMBER_CHINESE_BUTTON_6 -> {
                return lightNumberChineseButton12(controllerId, params);
            }
            case ETagTypeEnum.LIGHT -> {
                return lightTunnelLight(controllerId, params);
            }
            default -> {
                return "不支持的标签种类";
            }
        }
    }

    /**
     * 点亮带按钮3位数字标签
     * @param controllerId 控制器ID
     * @param params 点亮标签参数
     * @return 结果
     */
    public String lightNumberButton3(Integer controllerId, EtagLightParams params) {
        // 检查这次标签颜色是否与上次发送相同，若不同则重新发送标签颜色
        LedColorEnum etagTagColor = etagRedis.getEtagTagColor(params.getTagName());
        if(etagTagColor == null ||  etagTagColor != params.getLedColor()) {
            byte[] ledColorBytes = EtagInstruction.setLedColor(params.getTagId(), params.getLedColor());
            String sendLedColorBytes = EtagCommon.socketClient.sendBytes(controllerId.toString(), ledColorBytes);
            if(sendLedColorBytes != null) {
                // 发送成功，设置标签颜色，防止下次重复发送
                etagRedis.setEtagTagColor(params.getTagName(), params.getLedColor());
            }
        }
        // 检查这次闪烁要求是否和上次相同，若不同则重新发送闪烁颜色
        LedBlinkingEnum etagTagBlinking = etagRedis.getEtagTagBlinking(params.getTagName());
        if(etagTagBlinking == null ||  etagTagBlinking != params.getLedBlinking()) {
            byte[] ledBlinkingBytes = EtagInstruction.setLedBlinking(params.getTagId(), params.getLedBlinking());
            String sendLedBlinkingBytes = EtagCommon.socketClient.sendBytes(controllerId.toString(), ledBlinkingBytes);
            if(sendLedBlinkingBytes != null) {
                // 发送成功，设置标签闪烁，防止下次重复发送
                etagRedis.setEtagTagBlinking(params.getTagName(), params.getLedBlinking());
            }
        }
        // 发送标签值
        byte[] tagValueBytes = EtagInstruction.showNumber6(params.getTagId(), params.getTagValue());
        String sendResult = EtagCommon.socketClient.sendBytes(controllerId.toString(), tagValueBytes);
        if(sendResult != null) {
            log.info("发送电子标签信息失败，标签名称：{}，发送数据：{}，结果：{}", params.getTagName(), params, sendResult);
        }
        return sendResult;
    }

    /**
     * 点亮带按钮7位数字标签
     * @param controllerId 控制器ID
     * @param params 点亮标签参数
     * @return 结果
     */
    public String lightNumberButton7(Integer controllerId, EtagLightParams params) {
        // 等遇到这种标签在看，文档里面有点乱
        return "不支持";
    }

    /**
     * 点亮带按钮12位数字英文标签
     * @param controllerId 控制器ID
     * @param params 点亮标签参数
     * @return 结果
     */
    public String lightNumberEnglishButton12(Integer controllerId, EtagLightParams params) {
        // 检查这次标签颜色是否与上次发送相同，若不同则重新发送标签颜色
        LedColorEnum etagTagColor = etagRedis.getEtagTagColor(params.getTagName());
        if(etagTagColor == null ||  etagTagColor != params.getLedColor()) {
            byte[] ledColorBytes = EtagInstruction.setLedColor(params.getTagId(), params.getLedColor());
            String sendLedColorBytes = EtagCommon.socketClient.sendBytes(controllerId.toString(), ledColorBytes);
            if(sendLedColorBytes != null) {
                // 发送成功，设置标签颜色，防止下次重复发送
                etagRedis.setEtagTagColor(params.getTagName(), params.getLedColor());
            }
        }
        // 检查这次闪烁要求是否和上次相同，若不同则重新发送闪烁颜色
        LedBlinkingEnum etagTagBlinking = etagRedis.getEtagTagBlinking(params.getTagName());
        if(etagTagBlinking == null ||  etagTagBlinking != params.getLedBlinking()) {
            byte[] ledBlinkingBytes = EtagInstruction.setLedBlinking(params.getTagId(), params.getLedBlinking());
            String sendLedBlinkingBytes = EtagCommon.socketClient.sendBytes(controllerId.toString(), ledBlinkingBytes);
            if(sendLedBlinkingBytes != null) {
                // 发送成功，设置标签闪烁，防止下次重复发送
                etagRedis.setEtagTagBlinking(params.getTagName(), params.getLedBlinking());
            }
        }
        // 发送标签值
        byte[] tagValueBytes = EtagInstruction.showEnglishString12(params.getTagId(), params.getTagValue());
        String sendResult = EtagCommon.socketClient.sendBytes(controllerId.toString(), tagValueBytes);
        if(sendResult != null) {
            log.info("发送电子标签信息失败，标签名称：{}，发送数据：{}，结果：{}", params.getTagName(), params, sendResult);
        }
        return sendResult;
    }

    /**
     * 点亮带按钮6位数字中文标签
     * @param controllerId 控制器ID
     * @param params 点亮标签参数
     * @return 结果
     */
    public String lightNumberChineseButton12(Integer controllerId, EtagLightParams params) {
        // 检查这次标签颜色是否与上次发送相同，若不同则重新发送标签颜色
        LedColorEnum etagTagColor = etagRedis.getEtagTagColor(params.getTagName());
        if(etagTagColor == null ||  etagTagColor != params.getLedColor()) {
            byte[] ledColorBytes = EtagInstruction.setLedColor(params.getTagId(), params.getLedColor());
            String sendLedColorBytes = EtagCommon.socketClient.sendBytes(controllerId.toString(), ledColorBytes);
            if(sendLedColorBytes != null) {
                // 发送成功，设置标签颜色，防止下次重复发送
                etagRedis.setEtagTagColor(params.getTagName(), params.getLedColor());
            }
        }
        // 检查这次闪烁要求是否和上次相同，若不同则重新发送闪烁颜色
        LedBlinkingEnum etagTagBlinking = etagRedis.getEtagTagBlinking(params.getTagName());
        if(etagTagBlinking == null ||  etagTagBlinking != params.getLedBlinking()) {
            byte[] ledBlinkingBytes = EtagInstruction.setLedBlinking(params.getTagId(), params.getLedBlinking());
            String sendLedBlinkingBytes = EtagCommon.socketClient.sendBytes(controllerId.toString(), ledBlinkingBytes);
            if(sendLedBlinkingBytes != null) {
                // 发送成功，设置标签闪烁，防止下次重复发送
                etagRedis.setEtagTagBlinking(params.getTagName(), params.getLedBlinking());
            }
        }
        String sendResult = "";
        // 发送标签中文
        byte[] tagStringBytes = EtagInstruction.setChineseString(params.getTagId(), params.getTagString());
        sendResult += EtagCommon.socketClient.sendBytes(controllerId.toString(), tagStringBytes);
        // 发送标签值
        byte[] tagValueBytes = EtagInstruction.showChineseNumber6(params.getTagId(), params.getTagValue());
        sendResult += EtagCommon.socketClient.sendBytes(controllerId.toString(), tagValueBytes);
        if(!sendResult.isEmpty()) {
            log.info("发送电子标签信息失败，标签名称：{}，发送数据：{}，结果：{}", params.getTagName(), params, sendResult);
        }
        return sendResult;

    }

    /**
     * 点亮通道灯
     * @param controllerId 控制器ID
     * @param params 点亮标签参数
     * @return 结果
     */
    public String lightTunnelLight(Integer controllerId, EtagLightParams params) {
        String lightValueBit = "0" + LedBlinkingEnum.getBlinkingBitString(params.getLedBlinking())
                + "0" + LedColorEnum.getLightColorBitString(params.getLedColor());
        byte[] lightBytes = EtagInstruction.light(params.getTagId(), lightValueBit);
        String sendResult = EtagCommon.socketClient.sendBytes(controllerId.toString(), lightBytes);
        if(sendResult != null) {
            log.info("发送电子标签信息失败，标签名称：{}，发送数据：{}，结果：{}", params.getTagName(), params, sendResult);
        }
        return sendResult;
    }


}
