package com.easyagents.federation.sql.compile;

import com.easyagents.federation.sql.execute.SqlParameter;
import java.util.List;

/**
 * SQL Explain 请求。
 *
 * @param compileRequest 编译请求
 * @param level Explain 深度
 * @param parameters 保留的兼容字段；为避免数据库计划回显敏感值，只允许为空
 */
public record SqlExplainRequest(
    SqlCompileRequest compileRequest,
    SqlExplainLevel level,
    List<SqlParameter> parameters
) {

    /**
     * 校验 Explain 请求。
     */
    public SqlExplainRequest {
        if (compileRequest == null) {
            throw new IllegalArgumentException("compileRequest must not be null");
        }
        level = level == null ? SqlExplainLevel.PHYSICAL : level;
        parameters = List.copyOf(parameters == null ? List.of() : parameters);
        if (!parameters.isEmpty()) {
            throw new IllegalArgumentException(
                "physical Explain does not accept parameter values; "
                    + "declare JDBC types in compileRequest"
            );
        }
    }

    /**
     * 创建默认物理 Explain 请求，不提供实际参数值。
     *
     * @param compileRequest 编译请求
     */
    public SqlExplainRequest(SqlCompileRequest compileRequest) {
        this(compileRequest, SqlExplainLevel.PHYSICAL, List.of());
    }

    /**
     * 创建指定深度的 Explain 请求。
     *
     * @param compileRequest 编译请求
     * @param level Explain 深度
     */
    public SqlExplainRequest(SqlCompileRequest compileRequest, SqlExplainLevel level) {
        this(compileRequest, level, List.of());
    }
}
