/*
 * 文 件 名:  WorkParamSetFrame
 * 版    权:  华设设计集团股份有限公司
 * 描    述:  充电桩工作参数设置帧
 * 修 改 人:  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;

/**
 * 充电桩工作参数设置帧 (0x52)
 * 远程设置充电桩是否停用；设置充电桩允许输出功率，以实现电网功率的调节
 * 这是能耗平台进行功率调控的关键帧
 *
 * @author lvwenbin
 * @version [版本号, 2025/12/22]
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class WorkParamSetFrame extends BaseFrame {
    
    /**
     * 桩编号 (BCD码 7字节)
     */
    private String pileCode;
    
    /**
     * 是否允许工作 (BIN码 1字节)
     * 0x00 表示允许正常工作
     * 0x01 表示停止使用，锁定充电桩
     */
    private byte allowWork;
    
    /**
     * 充电桩最大允许输出功率 (BIN码 1字节)
     * 1BIN表示1%，最大100%，最小30%
     */
    private int maxOutputPowerPercent;
    
    public WorkParamSetFrame() {
    }
    
    public WorkParamSetFrame(String pileCode, boolean allowWork, int maxOutputPowerPercent) {
        this.pileCode = pileCode;
        this.allowWork = allowWork ? ProtocolConstants.WORK_ALLOW : ProtocolConstants.WORK_DISABLE;
        this.maxOutputPowerPercent = Math.max(30, Math.min(100, maxOutputPowerPercent));
    }
    
    @Override
    public byte getFrameType() {
        return ProtocolConstants.FRAME_TYPE_WORK_PARAM_SET;
    }
    
    @Override
    protected void encodeBody(ByteBuf buf) {
        ByteUtils.writeBcd(buf, pileCode, 7);
        buf.writeByte(allowWork);
        buf.writeByte(maxOutputPowerPercent);
    }
    
    @Override
    protected void decodeBody(ByteBuf buf) {
        this.pileCode = ByteUtils.readBcd(buf, 7);
        this.allowWork = buf.readByte();
        this.maxOutputPowerPercent = buf.readByte() & 0xFF;
    }
    
    /**
     * 是否允许工作
     */
    public boolean isAllowWork() {
        return allowWork == ProtocolConstants.WORK_ALLOW;
    }
    
    /**
     * 创建功率限制设置
     *
     * @param pileCode             桩编码
     * @param maxOutputPowerPercent 最大输出功率百分比(30-100)
     * @param sequenceNo           序列号
     * @return 设置帧
     */
    public static WorkParamSetFrame createPowerLimit(String pileCode, int maxOutputPowerPercent, int sequenceNo) {
        WorkParamSetFrame frame = new WorkParamSetFrame(pileCode, true, maxOutputPowerPercent);
        frame.setSequenceNo(sequenceNo);
        return frame;
    }
    
    /**
     * 创建启用充电桩设置
     *
     * @param pileCode   桩编码
     * @param sequenceNo 序列号
     * @return 设置帧
     */
    public static WorkParamSetFrame createEnable(String pileCode, int sequenceNo) {
        WorkParamSetFrame frame = new WorkParamSetFrame(pileCode, true, 100);
        frame.setSequenceNo(sequenceNo);
        return frame;
    }
    
    /**
     * 创建禁用充电桩设置
     *
     * @param pileCode   桩编码
     * @param sequenceNo 序列号
     * @return 设置帧
     */
    public static WorkParamSetFrame createDisable(String pileCode, int sequenceNo) {
        WorkParamSetFrame frame = new WorkParamSetFrame(pileCode, false, 0);
        frame.setSequenceNo(sequenceNo);
        return frame;
    }
    
    @Override
    public String toString() {
        return String.format("WorkParamSetFrame[pileCode=%s, allowWork=%s, maxPower=%d%%]",
            pileCode, isAllowWork() ? "是" : "否", maxOutputPowerPercent);
    }
}
