import type { LoggerWrapper } from "./ConfigCatLogger";
import { EvaluateLogBuilder } from "./EvaluateLogBuilder";
import type { IPercentageOption, ITargetingRule, PercentageOption, ProjectConfig, Setting, SettingValue, SettingValueContainer, TargetingRule, VariationIdValue } from "./ProjectConfig";
import type { User } from "./User";
export declare class EvaluateContext {
    readonly key: string;
    readonly setting: Setting;
    readonly user: User | undefined;
    readonly settings: Readonly<{
        [name: string]: Setting;
    }>;
    private $visitedFlags?;
    get visitedFlags(): string[];
    isMissingUserObjectLogged?: boolean;
    isMissingUserObjectAttributeLogged?: boolean;
    logBuilder?: EvaluateLogBuilder;
    constructor(key: string, setting: Setting, user: User | undefined, settings: Readonly<{
        [name: string]: Setting;
    }>);
    static forPrerequisiteFlag(key: string, setting: Setting, dependentFlagContext: EvaluateContext): EvaluateContext;
}
export interface IEvaluateResult {
    selectedValue: SettingValueContainer;
    matchedTargetingRule?: TargetingRule;
    matchedPercentageOption?: PercentageOption;
}
export interface IRolloutEvaluator {
    evaluate(defaultValue: SettingValue, context: EvaluateContext): IEvaluateResult;
}
export declare class RolloutEvaluator implements IRolloutEvaluator {
    private readonly logger;
    constructor(logger: LoggerWrapper);
    evaluate(defaultValue: SettingValue, context: EvaluateContext): IEvaluateResult;
    private evaluateSetting;
    private evaluateTargetingRules;
    private evaluatePercentageOptions;
    private evaluateConditions;
    private evaluateUserCondition;
    private evaluateTextEquals;
    private evaluateSensitiveTextEquals;
    private evaluateTextIsOneOf;
    private evaluateSensitiveTextIsOneOf;
    private evaluateTextSliceEqualsAnyOf;
    private evaluateSensitiveTextSliceEqualsAnyOf;
    private evaluateTextContainsAnyOf;
    private evaluateSemVerIsOneOf;
    private evaluateSemVerRelation;
    private evaluateNumberRelation;
    private evaluateDateTimeRelation;
    private evaluateArrayContainsAnyOf;
    private evaluateSensitiveArrayContainsAnyOf;
    private evaluatePrerequisiteFlagCondition;
    private evaluateSegmentCondition;
}
export declare type SettingTypeOf<T> = T extends boolean ? boolean : T extends number ? number : T extends string ? string : T extends null ? boolean | number | string | null : T extends undefined ? boolean | number | string | undefined : any;
/** The evaluated value and additional information about the evaluation of a feature flag or setting. */
export interface IEvaluationDetails<TValue extends SettingValue = SettingValue> {
    /** Key of the feature flag or setting. */
    key: string;
    /** Evaluated value of the feature or setting flag. */
    value: TValue;
    /** Variation ID of the feature or setting flag (if available). */
    variationId?: VariationIdValue;
    /** Time of last successful config download (if there has been a successful download already). */
    fetchTime?: Date;
    /** The User object used for the evaluation (if available). */
    user?: User;
    /**
     * Indicates whether the default value passed to the setting evaluation methods like `IConfigCatClient.getValueAsync`, `IConfigCatClient.getValueDetailsAsync`, etc.
     * is used as the result of the evaluation.
     */
    isDefaultValue: boolean;
    /** Error message in case evaluation failed. */
    errorMessage?: string;
    /** The exception object related to the error in case evaluation failed (if any). */
    errorException?: any;
    /** The targeting rule (if any) that matched during the evaluation and was used to return the evaluated value. */
    matchedTargetingRule?: ITargetingRule;
    /** The percentage option (if any) that was used to select the evaluated value. */
    matchedPercentageOption?: IPercentageOption;
}
export declare function evaluationDetailsFromDefaultValue<T extends SettingValue>(key: string, defaultValue: T, fetchTime?: Date, user?: User, errorMessage?: string, errorException?: any): IEvaluationDetails<SettingTypeOf<T>>;
export declare function evaluate<T extends SettingValue>(evaluator: IRolloutEvaluator, settings: Readonly<{
    [name: string]: Setting;
}> | null, key: string, defaultValue: T, user: User | undefined, remoteConfig: ProjectConfig | null, logger: LoggerWrapper): IEvaluationDetails<SettingTypeOf<T>>;
export declare function evaluateAll(evaluator: IRolloutEvaluator, settings: Readonly<{
    [name: string]: Setting;
}> | null, user: User | undefined, remoteConfig: ProjectConfig | null, logger: LoggerWrapper, defaultReturnValue: string): [IEvaluationDetails[], any[] | undefined];
export declare function checkSettingsAvailable(settings: Readonly<{
    [name: string]: Setting;
}> | null, logger: LoggerWrapper, defaultReturnValue: string): settings is Readonly<{
    [name: string]: Setting;
}>;
export declare function isAllowedValue(value: unknown): value is NonNullable<SettingValue>;
export declare function handleInvalidReturnValue(value: unknown): never;
export declare function getTimestampAsDate(projectConfig: ProjectConfig | null): Date | undefined;
//# sourceMappingURL=RolloutEvaluator.d.ts.map