/*
 * 文 件 名:  ReadRealtimeDataFrame
 * 版    权:  华设设计集团股份有限公司
 * 描    述:  读取实时监测数据请求帧
 * 修 改 人:  lvwenbin
 * 修改时间:  2025/12/22
 */
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;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 读取实时监测数据请求帧 (0x12)
 * 运营平台根据需要主动发起读取实时数据的请求
 *
 * @author lvwenbin
 * @version [版本号, 2025/12/22]
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class ReadRealtimeDataFrame extends BaseFrame {
    
    /**
     * 桩编号 (BCD码 7字节)
     */
    private String pileCode;
    
    /**
     * 枪号 (BCD码 1字节)
     */
    private String gunNo;
    
    public ReadRealtimeDataFrame() {
    }
    
    public ReadRealtimeDataFrame(String pileCode, String gunNo) {
        this.pileCode = pileCode;
        this.gunNo = gunNo;
    }
    
    @Override
    public byte getFrameType() {
        return ProtocolConstants.FRAME_TYPE_READ_REALTIME_DATA;
    }
    
    @Override
    protected void encodeBody(ByteBuf buf) {
        ByteUtils.writeBcd(buf, pileCode, 7);
        ByteUtils.writeBcd(buf, gunNo, 1);
    }
    
    @Override
    protected void decodeBody(ByteBuf buf) {
        this.pileCode = ByteUtils.readBcd(buf, 7);
        this.gunNo = ByteUtils.readBcd(buf, 1);
    }
    
    /**
     * 创建读取实时数据请求
     *
     * @param pileCode   桩编码
     * @param gunNo      枪号
     * @param sequenceNo 序列号
     * @return 请求帧
     */
    public static ReadRealtimeDataFrame create(String pileCode, String gunNo, int sequenceNo) {
        ReadRealtimeDataFrame frame = new ReadRealtimeDataFrame(pileCode, gunNo);
        frame.setSequenceNo(sequenceNo);
        return frame;
    }
    
    @Override
    public String toString() {
        return String.format("ReadRealtimeDataFrame[pileCode=%s, gunNo=%s]", pileCode, gunNo);
    }
}
