import { SelectQuery, SimpleSelectQuery } from "../models/SelectQuery";
import { type ValueComponent } from "../models/ValueComponent";
import { type SupportedOptionalConditionBranch } from "./PruneOptionalConditionBranches";
export type SSSQLFilterValue = unknown;
export type SSSQLFilterInput = Record<string, SSSQLFilterValue>;
export type SssqlScaffoldFilters = SSSQLFilterInput;
export type SssqlScalarOperator = "=" | "<>" | "<" | "<=" | ">" | ">=" | "like" | "ilike";
export type SssqlScalarOperatorInput = SssqlScalarOperator | "!=";
export type SssqlBranchKind = "scalar" | "exists" | "not-exists" | "expression";
export interface SssqlTransformResult {
    query: SelectQuery;
}
export type SssqlRewriteEditKind = "insert" | "replace" | "delete";
export interface SssqlRewriteEdit {
    start: number;
    end: number;
    before: string;
    after: string;
    kind: SssqlRewriteEditKind;
    reason?: string;
    target?: SssqlRewriteEditTarget;
}
export interface SssqlRewriteEditTarget {
    branchKind: SssqlBranchKind;
    parameterName: string;
    column?: string;
}
export type SssqlRewriteChangedRegionKind = "target-branch" | "where-keyword" | "boolean-operator" | "parentheses" | "formatter-rewrite" | "comment" | "unknown";
export interface SssqlRewriteChangedRegion {
    kind: SssqlRewriteChangedRegionKind;
    start: number;
    end: number;
    message?: string;
}
export interface SssqlRewritePlanWarning {
    code: string;
    message: string;
    detail?: unknown;
}
export interface SssqlRewritePlanError {
    code: string;
    message: string;
    detail?: unknown;
}
export interface SssqlRewriteSafety {
    tokenCountBefore: number;
    tokenCountAfter: number;
    tokenSequencePreserved: boolean;
    commentsPreserved: boolean;
    changedOnlyTargetBranches: boolean;
    changedRegions: readonly SssqlRewriteChangedRegion[];
}
export interface SssqlRewritePlan {
    ok: boolean;
    requiresFullReformat: boolean;
    edits: readonly SssqlRewriteEdit[];
    sql?: string;
    safety: SssqlRewriteSafety;
    warnings: readonly SssqlRewritePlanWarning[];
    errors: readonly SssqlRewritePlanError[];
}
export interface SssqlBranchInfo {
    parameterName: string;
    kind: SssqlBranchKind;
    operator?: SssqlScalarOperator;
    target?: string;
    query: SimpleSelectQuery;
    expression: ValueComponent;
    sql: string;
}
export interface SssqlScalarScaffoldSpec {
    kind?: "scalar";
    target: string;
    parameterName?: string;
    operator?: SssqlScalarOperatorInput;
}
export interface SssqlExistsScaffoldSpec {
    kind: "exists" | "not-exists";
    parameterName: string;
    query: string;
    anchorColumns: string[];
}
export type SssqlScaffoldSpec = SssqlScalarScaffoldSpec | SssqlExistsScaffoldSpec;
export interface SssqlRemoveSpec {
    parameterName: string;
    kind?: SssqlBranchKind;
    operator?: SssqlScalarOperatorInput;
    target?: string;
}
/**
 * Builds and refreshes truthful SSSQL optional filter branches.
 * Runtime callers should use pruning, not dynamic predicate injection.
 */
export declare class SSSQLFilterBuilder {
    private readonly tableColumnResolver?;
    private readonly finder;
    constructor(tableColumnResolver?: ((tableName: string) => string[]) | undefined);
    list(query: SelectQuery | string): SssqlBranchInfo[];
    planScaffold(query: SelectQuery | string, filters: SSSQLFilterInput): SssqlRewritePlan;
    dryRunScaffold(query: SelectQuery | string, filters: SSSQLFilterInput): SssqlRewritePlan;
    planScaffoldBranch(query: SelectQuery | string, spec: SssqlScaffoldSpec): SssqlRewritePlan;
    dryRunScaffoldBranch(query: SelectQuery | string, spec: SssqlScaffoldSpec): SssqlRewritePlan;
    planRefresh(query: SelectQuery | string, filters: SSSQLFilterInput): SssqlRewritePlan;
    dryRunRefresh(query: SelectQuery | string, filters: SSSQLFilterInput): SssqlRewritePlan;
    planRemove(query: SelectQuery | string, spec: SssqlRemoveSpec): SssqlRewritePlan;
    dryRunRemove(query: SelectQuery | string, spec: SssqlRemoveSpec): SssqlRewritePlan;
    planRemoveAll(query: SelectQuery | string): SssqlRewritePlan;
    dryRunRemoveAll(query: SelectQuery | string): SssqlRewritePlan;
    scaffold(query: SelectQuery | string, filters: SSSQLFilterInput): SelectQuery;
    scaffoldBranch(query: SelectQuery | string, spec: SssqlScaffoldSpec): SelectQuery;
    refresh(query: SelectQuery | string, filters: SSSQLFilterInput): SelectQuery;
    private refreshParsed;
    remove(query: SelectQuery | string, spec: SssqlRemoveSpec): SelectQuery;
    removeAll(query: SelectQuery | string): SelectQuery;
    private parseQuery;
    private planScalarInsert;
    private planExistsInsert;
    private buildMinimalInsertPlan;
    private planBranchRemoval;
    private buildPlanFromEdits;
    private planRewrite;
    private findMatchingBranchInfos;
    private scaffoldScalarBranch;
    private scaffoldExistsBranch;
    private resolveTarget;
    private resolveTargetInQuery;
    private resolveQualifiedTarget;
    private resolveUnqualifiedTarget;
    private tryResolveTarget;
    private findAliasForTable;
    private resolveAliasForSource;
    private buildCorrelatedRefreshPlan;
    private collectSourceAliases;
    private resolveCorrelatedAnchorTarget;
    private findSourceExpressionByAlias;
    private resolveSourceExpressionToUpstreamQuery;
    private resolveAnchorTargetInQuery;
    private getSourceAlias;
    private buildScalarRefreshPlan;
    private resolveScalarTargetInQuery;
    private isNullableBranchColumn;
    private hasLaterJoinThatNullsPriorSources;
    private isPriorSourcesNullableJoin;
    private isJoinedSourceNullable;
    private rebaseMovedBranch;
    private rebaseMovedBranchByAlias;
}
export type { SupportedOptionalConditionBranch };
export declare const scaffoldSssqlQuery: (sqlContent: string, filters: SssqlScaffoldFilters) => SssqlTransformResult;
export declare const refreshSssqlQuery: (sqlContent: string, filters: SssqlScaffoldFilters) => SssqlTransformResult;
