package com.huangzj.base.cmd;

import com.google.protobuf.Message;
import io.netty.channel.ChannelHandlerContext;
import lombok.Getter;
import lombok.experimental.Accessors;

/**
 * 命令执行上下文：Netty、跨服调用器、CmdRpcEnvelope cross_ret，以及网络层根据 {@link ProtoInfo} 解析好的请求/响应 Builder。
 */
@Getter
@Accessors(fluent = true)
public class CommandContext {

    private final ChannelHandlerContext channelHandlerContext;
    private final CrossRpcInvoker crossRpc;
    private final int crossReturnCode;
    /**
     * 本帧在 {@link ProtoRegistry} 中对应的元数据；未注册强类型协议时为 null。
     */
    private final ProtoInfo protoInfo;
    /**
     * 网络层已按 {@link ProtoInfo#ctsClass()} 解析出的请求体；无 ProtoInfo 时为 null。
     */
    private final Message decodedRequest;
    /**
     * 网络层按 {@link ProtoInfo#stcClass()} 创建的 STC Builder，业务填充后组包；无 ProtoInfo 时为 null。
     */
    private final Message.Builder responseBuilder;

    public CommandContext(ChannelHandlerContext channelHandlerContext, CrossRpcInvoker crossRpcInvoker) {
        this(channelHandlerContext, crossRpcInvoker, 0, null, null, null);
    }

    public CommandContext(ChannelHandlerContext channelHandlerContext, CrossRpcInvoker crossRpcInvoker, int crossReturnCode) {
        this(channelHandlerContext, crossRpcInvoker, crossReturnCode, null, null, null);
    }

    /**
     * @param protoInfo       可为 null
     * @param decodedRequest  与 protoInfo 成对；有 protoInfo 时通常非 null
     * @param responseBuilder 与 protoInfo 成对；有 protoInfo 时通常非 null
     */
    public CommandContext(ChannelHandlerContext channelHandlerContext, CrossRpcInvoker crossRpcInvoker, int crossReturnCode, ProtoInfo protoInfo, Message decodedRequest, Message.Builder responseBuilder) {
        this.channelHandlerContext = channelHandlerContext;
        this.crossRpc = crossRpcInvoker;
        this.crossReturnCode = crossReturnCode;
        this.protoInfo = protoInfo;
        this.decodedRequest = decodedRequest;
        this.responseBuilder = responseBuilder;
    }
}
