/**
 * Copyright (c) 2026-present, Goldman Sachs
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import type { PureModel, ObserverContext, AbstractPropertyExpression, PrimitiveInstanceValue, CollectionInstanceValue, VariableExpression, ColSpecArrayInstance, ColSpecInstanceValue } from '@finos/legend-graph';
import type { LambdaBody } from './DataQualityLambdaParameterParser.js';
import { DATA_QUALITY_VALIDATION_LOGICAL_FUNCTIONS } from '../constants/DataQualityConstants.js';
export interface VariableDeclaration {
    value: string;
    type: string;
}
export interface BaseValidationParameters {
    variableDeclaration?: VariableExpression;
}
export interface AssertionValidationParameters extends BaseValidationParameters {
    columns: ColSpecArrayInstance;
    otherParam?: DataQualityValidationFilterFunction | DataQualityValidationCustomHelperFunction;
}
export interface CustomHelperValidationParameters extends BaseValidationParameters {
    column: ColSpecInstanceValue;
    otherParams: Array<PrimitiveInstanceValue | CollectionInstanceValue>;
}
export interface FilterValidationParameters extends BaseValidationParameters {
    lambda: {
        body: DataQualityValidationFilterCondition | DataQualityValidationLogicalGroupFunction;
    } & BaseValidationParameters;
}
export interface FilterConditionParameters {
    property: AbstractPropertyExpression | DataQualityValidationPropertyGuarantee;
    otherParams: (PrimitiveInstanceValue | CollectionInstanceValue)[];
}
export interface PropertyGuaranteeParameters {
    property: AbstractPropertyExpression;
}
export interface LogicalGroupValidationParameters {
    left: DataQualityValidationFilterCondition | DataQualityValidationLogicalGroupFunction;
    right: DataQualityValidationFilterCondition | DataQualityValidationLogicalGroupFunction;
}
export declare abstract class DataQualityValidationFunction<T> {
    protected type: string;
    abstract name: string;
    abstract parameters: T;
    abstract accept<R>(visitor: DataQualityValidationFunctionVisitor<R>): R;
    id: string;
    createParameterFromLambda(lambdaBody: LambdaBody, graph: PureModel, observerContext: ObserverContext): void;
}
export interface DataQualityValidationFunctionVisitor<T> {
    visitAssertion(func: DataQualityValidationAssertionFunction): T;
    visitFilter(func: DataQualityValidationFilterFunction): T;
    visitCustomHelper(func: DataQualityValidationCustomHelperFunction): T;
    visitFilterCondition(func: DataQualityValidationFilterCondition): T;
    visitLogicalGroup(func: DataQualityValidationLogicalGroupFunction): T;
    visitPropertyGuarantee(func: DataQualityValidationPropertyGuarantee, context?: unknown): T;
}
export declare class DataQualityValidationFilterFunction extends DataQualityValidationFunction<FilterValidationParameters> {
    readonly name = "filter";
    parameters: FilterValidationParameters;
    lambdaBodyVariableDeclaration: VariableDeclaration | undefined;
    constructor(parameters: FilterValidationParameters);
    accept<R>(visitor: DataQualityValidationFunctionVisitor<R>): R;
}
declare abstract class AbstractDataQualityValidationFilterCondition<T> extends DataQualityValidationFunction<T> {
    name: string;
    parameters: T;
    constructor(name: string, parameters: T);
    abstract accept<R>(visitor: DataQualityValidationFunctionVisitor<R>): R;
}
export declare class DataQualityValidationFilterCondition extends AbstractDataQualityValidationFilterCondition<FilterConditionParameters> {
    accept<R>(visitor: DataQualityValidationFunctionVisitor<R>): R;
}
export declare class DataQualityValidationPropertyGuarantee extends AbstractDataQualityValidationFilterCondition<PropertyGuaranteeParameters> {
    accept<R>(visitor: DataQualityValidationFunctionVisitor<R>, context?: unknown): R;
}
export declare class DataQualityValidationLogicalGroupFunction extends DataQualityValidationFunction<LogicalGroupValidationParameters> {
    name: DATA_QUALITY_VALIDATION_LOGICAL_FUNCTIONS;
    parameters: LogicalGroupValidationParameters;
    constructor(name: DATA_QUALITY_VALIDATION_LOGICAL_FUNCTIONS, parameters: LogicalGroupValidationParameters);
    changeName(): void;
    accept<R>(visitor: DataQualityValidationFunctionVisitor<R>): R;
}
export declare class DataQualityValidationCustomHelperFunction extends DataQualityValidationFunction<CustomHelperValidationParameters> {
    name: string;
    parameters: CustomHelperValidationParameters;
    constructor(name: string, parameters: CustomHelperValidationParameters);
    accept<R>(visitor: DataQualityValidationFunctionVisitor<R>): R;
}
export declare class DataQualityValidationAssertionFunction extends DataQualityValidationFunction<AssertionValidationParameters> {
    name: string;
    parameters: AssertionValidationParameters;
    constructor(name: string, parameters: AssertionValidationParameters);
    accept<R>(visitor: DataQualityValidationFunctionVisitor<R>): R;
}
export {};
//# sourceMappingURL=DataQualityValidationFunction.d.ts.map