/*
 * 文 件 名:  TransactionConfirmFrame
 * 版    权:  华设设计集团股份有限公司
 * 描    述:  交易记录确认帧
 * 修 改 人:  lvwenbin
 * 修改时间:  2025/12/25
 */
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;

/**
 * 交易记录确认帧 (0x40)
 * 运营平台接收到结算账单上传后，回复此确认信息
 * 
 * 注意：
 * 1. 若桩未收到回复帧，则5分钟后继续上送一次交易记录
 * 2. 此帧仅表示平台成功接收到交易记录报文，并不代表交易订单成功结算
 *
 * @author lvwenbin
 * @version [版本号, 2025/12/25]
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class TransactionConfirmFrame extends BaseFrame {

    /**
     * 交易流水号 (BCD码 16字节)
     */
    private String transactionNo;

    /**
     * 确认结果 (BIN码 1字节)
     * 0x00：上传成功
     * 0x01：非法账单
     */
    private byte confirmResult;

    /**
     * 上传成功
     */
    public static final byte RESULT_SUCCESS = 0x00;

    /**
     * 非法账单
     */
    public static final byte RESULT_INVALID = 0x01;

    public TransactionConfirmFrame() {
    }

    public TransactionConfirmFrame(String transactionNo, boolean success) {
        this.transactionNo = transactionNo;
        this.confirmResult = success ? RESULT_SUCCESS : RESULT_INVALID;
    }

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

    @Override
    protected void encodeBody(ByteBuf buf) {
        ByteUtils.writeBcd(buf, transactionNo, 16);
        buf.writeByte(confirmResult);
    }

    @Override
    protected void decodeBody(ByteBuf buf) {
        this.transactionNo = ByteUtils.readBcd(buf, 16);
        this.confirmResult = buf.readByte();
    }

    /**
     * 是否确认成功
     */
    public boolean isSuccess() {
        return confirmResult == RESULT_SUCCESS;
    }

    /**
     * 创建成功确认
     *
     * @param transactionNo 交易流水号
     * @param sequenceNo    序列号
     * @return 确认帧
     */
    public static TransactionConfirmFrame success(String transactionNo, int sequenceNo) {
        TransactionConfirmFrame frame = new TransactionConfirmFrame(transactionNo, true);
        frame.setSequenceNo(sequenceNo);
        return frame;
    }

    /**
     * 创建失败确认（非法账单）
     *
     * @param transactionNo 交易流水号
     * @param sequenceNo    序列号
     * @return 确认帧
     */
    public static TransactionConfirmFrame invalid(String transactionNo, int sequenceNo) {
        TransactionConfirmFrame frame = new TransactionConfirmFrame(transactionNo, false);
        frame.setSequenceNo(sequenceNo);
        return frame;
    }

    @Override
    public String toString() {
        return String.format("TransactionConfirmFrame[transNo=%s, result=%s]",
            transactionNo, isSuccess() ? "成功" : "非法账单");
    }
}
