package com.easyagents.federation.sql.api;

import com.easyagents.federation.sql.execute.QueryId;
import com.easyagents.federation.sql.execute.SqlExecutionOptions;
import com.easyagents.federation.sql.execute.SqlParameter;
import java.time.Duration;
import java.util.List;

/**
 * 执行节点本地编译计划的上下文。
 *
 * @param queryId 查询标识
 * @param parameters 参数值
 * @param options JDBC 执行限制
 * @param admissionTimeout 查询准入等待上限
 */
public record SqlExecutionContext(
    QueryId queryId,
    List<SqlParameter> parameters,
    SqlExecutionOptions options,
    Duration admissionTimeout
) {

    /**
     * 校验并防御性复制执行上下文。
     */
    public SqlExecutionContext {
        queryId = queryId == null ? QueryId.create() : queryId;
        parameters = List.copyOf(parameters == null ? List.of() : parameters);
        options = options == null ? SqlExecutionOptions.defaults() : options;
        admissionTimeout = admissionTimeout == null ? Duration.ofSeconds(5) : admissionTimeout;
        if (admissionTimeout.isNegative()) {
            throw new IllegalArgumentException("admissionTimeout must not be negative");
        }
    }

    /**
     * 创建默认执行上下文。
     *
     * @param parameters 参数值
     * @return 执行上下文
     */
    public static SqlExecutionContext of(List<SqlParameter> parameters) {
        return new SqlExecutionContext(null, parameters, null, null);
    }
}
