import { ColumnBuilder } from "../../column-builder.js";
import type { ColumnBuilderBase, ColumnBuilderBaseConfig, ColumnBuilderExtraConfig, ColumnBuilderRuntimeConfig, ColumnDataType, HasGenerated, NotNull } from "../../column-builder.js";
import type { ColumnBaseConfig } from "../../column.js";
import { Column } from "../../column.js";
import { entityKind } from "../../entity.js";
import type { UpdateDeleteAction } from "../foreign-keys.js";
import type { MsSqlTable } from "../table.js";
import type { SQL } from "../../sql/index.js";
import type { Update } from "../../utils.js";
export interface ReferenceConfig {
    ref: () => MsSqlColumn;
    actions: {
        onUpdate?: UpdateDeleteAction;
        onDelete?: UpdateDeleteAction;
    };
}
export interface MsSqlColumnBuilderBase<T extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>, TTypeConfig extends object = object> extends ColumnBuilderBase<T, TTypeConfig & {
    dialect: 'mssql';
}> {
}
export interface MsSqlGeneratedColumnConfig {
    mode?: 'virtual' | 'persisted';
}
export declare abstract class MsSqlColumnBuilder<T extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string> & {
    data: any;
}, TRuntimeConfig extends object = object, TTypeConfig extends object = object, TExtraConfig extends ColumnBuilderExtraConfig = ColumnBuilderExtraConfig> extends ColumnBuilder<T, TRuntimeConfig, TTypeConfig & {
    dialect: 'mssql';
}, TExtraConfig> implements MsSqlColumnBuilderBase<T, TTypeConfig> {
    static readonly [entityKind]: string;
    private foreignKeyConfigs;
    references(ref: ReferenceConfig['ref'], actions?: ReferenceConfig['actions']): this;
    unique(name?: string): this;
    generatedAlwaysAs(as: SQL | T['data'] | (() => SQL), config?: MsSqlGeneratedColumnConfig): HasGenerated<this, {
        type: 'always';
    }>;
}
export declare abstract class MsSqlColumn<T extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>, TRuntimeConfig extends object = object, TTypeConfig extends object = {}> extends Column<T, TRuntimeConfig, TTypeConfig & {
    dialect: 'mssql';
}> {
    readonly table: MsSqlTable;
    static readonly [entityKind]: string;
    constructor(table: MsSqlTable, config: ColumnBuilderRuntimeConfig<T['data'], TRuntimeConfig>);
}
export type AnyMsSqlColumn<TPartial extends Partial<ColumnBaseConfig<ColumnDataType, string>> = {}> = MsSqlColumn<Required<Update<ColumnBaseConfig<ColumnDataType, string>, TPartial>>>;
export interface MsSqlColumnWithIdentityConfig {
    identity: {
        seed?: number;
        increment?: number;
    } | undefined;
}
export declare abstract class MsSqlColumnBuilderWithIdentity<T extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>, TRuntimeConfig extends object = object, TExtraConfig extends ColumnBuilderExtraConfig = ColumnBuilderExtraConfig> extends MsSqlColumnBuilder<T, TRuntimeConfig & MsSqlColumnWithIdentityConfig, TExtraConfig> {
    static readonly [entityKind]: string;
    constructor(name: NonNullable<T['name']>, dataType: T['dataType'], columnType: T['columnType']);
    identity(): NotNull<HasGenerated<this>>;
    identity(config: {
        seed: number;
        increment: number;
    }): NotNull<HasGenerated<this>>;
}
export declare abstract class MsSqlColumnWithIdentity<T extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>, TRuntimeConfig extends object = object> extends MsSqlColumn<T, MsSqlColumnWithIdentityConfig & TRuntimeConfig> {
    static readonly [entityKind]: string;
    readonly identity: {
        seed?: number;
        increment?: number;
    } | undefined;
    shouldDisableInsert(): boolean;
}
