/*
 * 文 件 名:  RemoteStopFrame
 * 版    权:  华设设计集团股份有限公司
 * 描    述:  远程停止充电帧 (服务端下发 0x36)
 * 修 改 人:  lvwenbin
 * 修改时间:  2025/01/07
 */
package com.ruoyi.ems.charging.model.resp;

import com.ruoyi.ems.charging.model.BaseFrame;
import com.ruoyi.ems.charging.protocol.ProtocolConstants;
import com.ruoyi.ems.charging.utils.ByteUtils;
import io.netty.buffer.ByteBuf;

/**
 * 远程停止充电帧 (服务端下发)
 * 帧类型: 0x36
 *
 * 消息体格式:
 * - 桩编号: 7字节 BCD码
 * - 枪号: 1字节 BCD码
 *
 * @author lvwenbin
 * @version [版本号, 2025/01/07]
 */
public class RemoteStopFrame extends BaseFrame {

    /**
     * 桩编号 (7字节BCD码, 14位数字)
     */
    private String pileCode;

    /**
     * 枪号 (1字节BCD码, 2位数字)
     */
    private String gunNo;

    @Override
    public byte getFrameType() {
        return ProtocolConstants.FRAME_TYPE_REMOTE_STOP;
    }

    /**
     * 创建远程停止充电帧
     * @param pileCode 桩编码 (14位)
     * @param gunNo 枪号 (2位)
     * @param sequenceNo 序列号
     * @return RemoteStopFrame实例
     */
    public static RemoteStopFrame create(String pileCode, String gunNo, int sequenceNo) {
        RemoteStopFrame frame = new RemoteStopFrame();
        frame.setPileCode(pileCode);
        frame.setGunNo(gunNo);
        frame.setSequenceNo(sequenceNo);
        return frame;
    }

    /**
     * 获取完整枪号 (桩编码 + 枪号)
     * @return 完整枪号，如 "3212830100010101"
     */
    public String getFullGunNo() {
        return pileCode + gunNo;
    }

    @Override
    protected void encodeBody(ByteBuf buf) {
        // 桩编号 7字节
        buf.writeBytes(ByteUtils.strToBcd(pileCode, 7));
        // 枪号 1字节
        buf.writeBytes(ByteUtils.strToBcd(gunNo, 1));
    }

    @Override
    protected void decodeBody(ByteBuf buf) {
        // 桩编号 7字节
        byte[] pileCodeBytes = new byte[7];
        buf.readBytes(pileCodeBytes);
        this.pileCode = ByteUtils.bcdToStr(pileCodeBytes);

        // 枪号 1字节
        byte[] gunNoBytes = new byte[1];
        buf.readBytes(gunNoBytes);
        this.gunNo = ByteUtils.bcdToStr(gunNoBytes);
    }

    // Getters and Setters
    public String getPileCode() {
        return pileCode;
    }

    public void setPileCode(String pileCode) {
        this.pileCode = pileCode;
    }

    public String getGunNo() {
        return gunNo;
    }

    public void setGunNo(String gunNo) {
        this.gunNo = gunNo;
    }

    @Override
    public String toString() {
        return String.format("RemoteStopFrame[pileCode=%s, gunNo=%s, seq=%d]",
            pileCode, gunNo, getSequenceNo());
    }
}