import { SelectQuery, SimpleSelectQuery } from "../models/SelectQuery";
import { ParameterConditionMove, ParameterConditionOptimizationError, ParameterConditionOptimizationOptions, ParameterConditionOptimizationWarning, ParameterConditionSkipped } from "./ParameterConditionPlacementOptimizer";
import { StaticPredicateMove, StaticPredicatePlacementError, StaticPredicatePlacementWarning, StaticPredicateSkipped } from "./StaticPredicatePlacementOptimizer";
import { ConditionDeduplicationApplied } from "./ConditionDeduplicationOptimizer";
import { OptionalConditionPruningParameters } from "./PruneOptionalConditionBranches";
export type ConditionOptimizationInput = string | SelectQuery | SimpleSelectQuery;
export type ConditionOptimizationPhaseKind = "sssql_optional_condition" | "parameter_condition_placement" | "static_predicate_placement" | "condition_deduplication";
export interface ConditionOptimizationOptions extends ParameterConditionOptimizationOptions {
    /**
     * Explicit opt-in values for SSSQL optional branch pruning.
     * Only listed parameter names are considered, and only null/undefined values
     * are pruned by the safe-only SSSQL phase.
     */
    optionalConditionParameters?: OptionalConditionPruningParameters;
}
export interface ConditionOptimizationPhaseSummary {
    kind: ConditionOptimizationPhaseKind;
    appliedCount: number;
    skippedCount: number;
    warningCount: number;
    errorCount: number;
}
export type ConditionOptimizationSkipDisposition = "blocked" | "unchanged" | "ignored";
export interface SssqlOptionalConditionApplied {
    phaseKind: "sssql_optional_condition";
    kind: "prune_optional_branch" | "refresh_optional_branch";
    conditionSql: string;
    parameterName: string;
    reason: string;
    previousConditionSql?: string;
}
export interface SssqlOptionalConditionSkipped {
    phaseKind: "sssql_optional_condition";
    kind: "optional_branch_skipped";
    conditionSql: string;
    parameterName: string;
    code: string;
    reason: string;
    skipDisposition: ConditionOptimizationSkipDisposition;
}
export type ConditionOptimizationApplied = SssqlOptionalConditionApplied | (ParameterConditionMove & {
    phaseKind: "parameter_condition_placement";
}) | (StaticPredicateMove & {
    phaseKind: "static_predicate_placement";
}) | (ConditionDeduplicationApplied & {
    phaseKind: "condition_deduplication";
});
export type ConditionOptimizationSkipped = SssqlOptionalConditionSkipped | (ParameterConditionSkipped & {
    phaseKind: "parameter_condition_placement";
    skipDisposition: ConditionOptimizationSkipDisposition;
}) | (StaticPredicateSkipped & {
    phaseKind: "static_predicate_placement";
    skipDisposition: ConditionOptimizationSkipDisposition;
});
export type ConditionOptimizationWarning = (ParameterConditionOptimizationWarning & {
    phaseKind: ConditionOptimizationPhaseKind;
}) | (StaticPredicatePlacementWarning & {
    phaseKind: ConditionOptimizationPhaseKind;
});
export type ConditionOptimizationError = (ParameterConditionOptimizationError & {
    phaseKind: ConditionOptimizationPhaseKind;
}) | (StaticPredicatePlacementError & {
    phaseKind: ConditionOptimizationPhaseKind;
});
export interface ConditionOptimizationSafety {
    mode: "safe_only";
    unsafeRewriteApplied: false;
    dryRun: boolean;
    formatterGeneratedSource: boolean;
}
export interface ConditionOptimizationSourceFilterProbe {
    kind: "source_filter_probe";
    source: string;
    sourceAlias: string;
    predicate: string;
    suggestedSql: string;
    reason: string;
    relation?: "source_filter" | "join_equivalence";
    targetPredicate?: string;
    targetScope?: {
        kind: "scope" | "cte" | "table" | "subquery" | "source";
        name: string;
    };
}
export interface ConditionOptimizationSkippedProbe {
    kind: "source_filter_probe_skipped";
    source?: string;
    sourceAlias?: string;
    predicate: string;
    code: string;
    reason: string;
}
export interface ConditionOptimizationDiagnostics {
    /**
     * Probe diagnostics are collected after SSSQL optional pruning/refresh and
     * before parameter/static placement phases, so they describe the pre-placement
     * source-filter debugging snapshot rather than the final rewritten query.
     */
    probes: readonly ConditionOptimizationSourceFilterProbe[];
    skippedProbes: readonly ConditionOptimizationSkippedProbe[];
    /**
     * API output shape review: keep result.sql/result.query as the production-safe
     * rewrite output and expose debugSql/debugQuery only for diagnostic pipelines.
     *
     * Debug-only probe SQL is additive: result.sql/result.query remain the safe-only
     * production rewrite output, while debugSql/debugQuery include investigation
     * probes that callers can feed into lineage/debug surfaces.
     */
    debugSql?: string;
    debugQuery?: SelectQuery | null;
}
export interface ConditionOptimizationResult {
    ok: boolean;
    sql: string;
    query: SelectQuery | null;
    phases: readonly ConditionOptimizationPhaseSummary[];
    applied: readonly ConditionOptimizationApplied[];
    skipped: readonly ConditionOptimizationSkipped[];
    warnings: readonly ConditionOptimizationWarning[];
    errors: readonly ConditionOptimizationError[];
    safety: ConditionOptimizationSafety;
    /** API output shape review: diagnostics is additive; sql/query keep their existing output shape for callers. */
    diagnostics?: ConditionOptimizationDiagnostics;
}
export declare const planConditionOptimization: (input: ConditionOptimizationInput, options?: ConditionOptimizationOptions) => ConditionOptimizationResult;
export declare const optimizeConditions: (input: ConditionOptimizationInput, options?: ConditionOptimizationOptions) => ConditionOptimizationResult;
