package com.pwt.netty.common.charger.client;

import com.pwt.netty.common.charger.RequestData;
import io.netty.buffer.ByteBuf;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

/**
 * 充电完成数据包
 */

@Getter
@Setter
@ToString
@EqualsAndHashCode(callSuper = true)
public class ChargeCompleteData extends RequestData {


    /**
     *
     * 充电状态
     * <br/> 0：待机；1：充电；2：停止；3：故障。此报文中充电状态只能是 2 或 3
     * <br/> data type: int8
     */
    private byte status;

    /**
     * 充电开始时间
     * <br /> 0~4294967295，10 位 unix 时间戳
     * <br /> data type: uint32
     */
    private long chargeStartTime;

    /**
     * 充电结束时间
     * <br /> 0~4294967295，10 位 unix 时间戳
     * <br /> data type: uint32
     */
    private long chargeEndTime;

    /**
     * 开始 SOC
     * <br />data type: uint8
     */
    private short startSOC;

    /**
     * 结束 SOC
     * <br />data type: uint8
     */
    private short endSOC;

    /**
     * 充电前电表读数
     * <br /> data type: float
     */
    private float beforeChargeData;

    /**
     * 充电后电表读数
     * <br /> data type: float
     */
    private float afterChargeData;

    /**
     * 本次充电电量
     * <br /> data type: float
     */
    private float currentChargeData;

    /**
     * 最高电池温度
     * <br /> data type: int32
     */
    private int highBatteryTemperature;

    /**
     * 最低电池温度
     * <br /> data type: int32
     */
    private int lowBatteryTemperature;

    /**
     * 停止原因
     * <br /> data type: int8
     */
    private byte stopReason;

    /**
     * 峰时电量
     * <p>
     *     单位：KWH
     *     偏移量：0
     *     数值范围：
     *     比例：0.1
     *     data type: int32
     * </p>
     */
    private int peakChargeData;

    /**
     * 谷时电量
     * <p>
     *     单位：KWH
     *     偏移量：0
     *     数值范围：
     *     比例：0.1
     *     data type: int32
     * </p>
     */
    private int valleyChargeData;

    /**
     * 平时电量
     * <p>
     *     单位：KWH
     *     偏移量：0
     *     数值范围：
     *     比例：0.1
     *     data type: int32
     * </p>
     */
    private int flatChargeData;

    /**
     * 最⾼单体动⼒蓄电池电压
     * <p>
     *     单位: v
     *     偏移量：0
     *     数值范围：0~24
     *     比例：0.01
     * </p>
     * <br />data type: uint16
     */
    private int cellMaxVoltage;

    /**
     * 最低单体动⼒蓄电池电压
     * <p>
     *     单位: v
     *     偏移量：0
     *     数值范围：0~24
     *     比例：0.01
     * </p>
     * <br />data type: uint16
     */
    private int cellMinVoltage;

    // 写入所有字段到 byteBuf,写入类型按字段注释中的 data type类型
    @Override
    public void encode(ByteBuf byteBuf)
    {
        byteBuf.writeByte(status);
        byteBuf.writeInt((int) chargeStartTime);
        byteBuf.writeInt((int) chargeEndTime);
        byteBuf.writeByte(startSOC);
        byteBuf.writeByte(endSOC);
        byteBuf.writeFloat(beforeChargeData);
        byteBuf.writeFloat(afterChargeData);
        byteBuf.writeFloat(currentChargeData);
        byteBuf.writeInt(highBatteryTemperature);
        byteBuf.writeInt(lowBatteryTemperature);
        byteBuf.writeByte(stopReason);
        byteBuf.writeInt(peakChargeData);
        byteBuf.writeInt(valleyChargeData);
        byteBuf.writeInt(flatChargeData);
        byteBuf.writeShort(cellMaxVoltage);
        byteBuf.writeShort(cellMinVoltage);

        byteBuf.writeByte(getEnd());
    }

    // 从 byteBuf 中读取所有字段,读取类型按字段注释中的 data type类型
    @Override
    public void decode(ByteBuf byteBuf)
    {
        status = byteBuf.readByte();
        chargeStartTime = byteBuf.readUnsignedInt();
        chargeEndTime = byteBuf.readUnsignedInt();
        startSOC = byteBuf.readUnsignedByte();
        endSOC = byteBuf.readUnsignedByte();
        beforeChargeData = byteBuf.readFloat();
        afterChargeData = byteBuf.readFloat();
        currentChargeData = byteBuf.readFloat();
        highBatteryTemperature = byteBuf.readInt();
        lowBatteryTemperature = byteBuf.readInt();
        stopReason = byteBuf.readByte();
        peakChargeData = byteBuf.readInt();
        valleyChargeData = byteBuf.readInt();
        flatChargeData = byteBuf.readInt();
        cellMaxVoltage = byteBuf.readUnsignedShort();
        cellMinVoltage = byteBuf.readUnsignedShort();
        byteBuf.skipBytes(1);
    }

    @Override
    public int getProtocolLength() {
        return 49;
    }

    @Override
    public byte getEnd() {
        return 0x16;
    }
}
