import type { BeanCollection } from '../context/context';
import type { GridOptions } from '../entities/gridOptions';
import type { ValidationModuleName } from '../interfaces/iModule';
import type { RowModelType } from '../interfaces/iRowModel';
import type { ErrorId, GetErrorParams } from './errorMessages/errorText';
import type { LogService } from './logService';
/**
 * A validation result that resolves to a first-class error id (so it is captured by the diagnostic
 * overlay and throw mode), rather than a free-text message. Build via {@link _createValidationWarning}.
 * `emit` is captured at construction, where the id/params pairing is concrete.
 * @internal AG_GRID_INTERNAL - Not for public use. Can change / be removed at any time.
 */
export interface ValidationWarning {
    errorId: ErrorId;
    /** Emit through the emitting grid's log service, so the diagnostic is attributed to that grid. */
    emit: (log: LogService) => void;
}
/** @internal AG_GRID_INTERNAL - Not for public use. Can change / be removed at any time. */
export declare function _createValidationWarning<TId extends ErrorId>(errorId: TId, params: GetErrorParams<TId>): ValidationWarning;
/**
 * As {@link _createValidationWarning}, but the diagnostic is captured as a deprecation (see {@link _deprecated}).
 * @internal AG_GRID_INTERNAL - Not for public use. Can change / be removed at any time.
 */
export declare function _createDeprecationWarning<TId extends ErrorId>(errorId: TId, params: GetErrorParams<TId>): ValidationWarning;
/**
 * Emits a validation result that may be either a first-class {@link ValidationWarning} or a legacy
 * free-text string (logged under the generic id 322), through the emitting grid's log service so the
 * diagnostic is attributed to that grid.
 * @internal AG_GRID_INTERNAL - Not for public use. Can change / be removed at any time.
 */
export declare function _emitValidationWarning(warning: string | ValidationWarning, log: LogService): void;
/** Build the set of all property names that should be accepted without warning. */
export declare function buildAllValidNames<T extends object>(allProperties: string[], deprecations: Deprecations<T>, propertyExceptions?: string[]): Set<string>;
export interface OptionsValidator<T extends object> {
    objectName: string;
    allProperties: string[];
    /** Pre-computed set of all accepted property names (valid + deprecated + exceptions + Vue). */
    allValidNames: Set<string>;
    docsUrl?: `${string}/`;
    deprecations: Deprecations<T>;
    validations: Validations<T>;
}
export type Deprecations<T extends object> = Partial<{
    [key in keyof T]: {
        version: string;
        message?: string;
    };
}>;
type GetRequiredModule<T extends object> = (options: T, gridOptions: GridOptions, beans: BeanCollection) => ValidationModuleName | ValidationModuleName[] | null;
export type RequiredModule<T extends object> = GetRequiredModule<T> | ValidationModuleName | ValidationModuleName[];
export type ModuleValidation<T extends object> = {
    [key in keyof T]?: RequiredModule<T>;
};
export type Validations<T extends object> = {
    [key in keyof T]?: OptionsValidation<T>;
};
interface OptionsValidation<T extends object> {
    supportedRowModels?: RowModelType[];
    dependencies?: RequiredOptions<T>;
    validate?: (options: T, gridOptions: GridOptions, beans: BeanCollection) => string | ValidationWarning | null;
    /** Currently only supports boolean or number */
    expectedType?: 'boolean' | 'number';
}
export type DependentValues<T extends object, K extends keyof T> = {
    required: T[K][];
    reason?: string;
};
export type RequiredOptions<T extends object> = {
    [K in keyof T]: DependentValues<T, K>;
};
export {};
