import { type Newable, type ServiceIdentifier } from '@inversifyjs/common';
import { type BindingActivation, type BindingConstraints, type BindingDeactivation, type DynamicValueBuilder, type Factory, type MetadataName, type MetadataTag, type ResolutionContext } from '@inversifyjs/core';
import { type BindingIdentifier } from './BindingIdentifier.js';
import { type MapToResolvedValueInjectOptions } from './MapToResolvedValueInjectOptions.js';
export interface BoundServiceSyntax {
    getIdentifier(): BindingIdentifier;
}
export interface BindToFluentSyntax<T> {
    to(type: Newable<T>): BindInWhenOnFluentSyntax<T>;
    toSelf(): BindInWhenOnFluentSyntax<T>;
    toConstantValue(value: T): BindWhenOnFluentSyntax<T>;
    toDynamicValue(builder: DynamicValueBuilder<T>): BindInWhenOnFluentSyntax<T>;
    toFactory(factory: T extends Factory<unknown, any> ? (context: ResolutionContext) => T | Promise<T> : never): BindWhenOnFluentSyntax<T>;
    toResolvedValue(factory: () => T | Promise<T>): BindInWhenOnFluentSyntax<T>;
    toResolvedValue<TArgs extends unknown[] = any[]>(factory: (...args: TArgs) => T | Promise<T>, injectOptions: MapToResolvedValueInjectOptions<TArgs>): BindInWhenOnFluentSyntax<T>;
    toService(service: ServiceIdentifier<T>): void;
}
export interface BindInFluentSyntax<T> extends BoundServiceSyntax {
    inSingletonScope(): BindWhenOnFluentSyntax<T>;
    inTransientScope(): BindWhenOnFluentSyntax<T>;
    inRequestScope(): BindWhenOnFluentSyntax<T>;
}
export interface BindInWhenOnFluentSyntax<T> extends BindInFluentSyntax<T>, BindWhenOnFluentSyntax<T> {
}
export interface BindOnFluentSyntax<T> extends BoundServiceSyntax {
    onActivation(activation: BindingActivation<T>): BindWhenFluentSyntax<T>;
    onDeactivation(deactivation: BindingDeactivation<T>): BindWhenFluentSyntax<T>;
}
export interface BindWhenOnFluentSyntax<T> extends BindWhenFluentSyntax<T>, BindOnFluentSyntax<T> {
}
export interface BindWhenFluentSyntax<T> extends BoundServiceSyntax {
    when(constraint: (metadata: BindingConstraints) => boolean): BindOnFluentSyntax<T>;
    whenAnyAncestor(constraint: (metadata: BindingConstraints) => boolean): BindOnFluentSyntax<T>;
    whenAnyAncestorIs(serviceIdentifier: ServiceIdentifier): BindOnFluentSyntax<T>;
    whenAnyAncestorNamed(name: MetadataName): BindOnFluentSyntax<T>;
    whenAnyAncestorTagged(tag: MetadataTag, tagValue: unknown): BindOnFluentSyntax<T>;
    whenDefault(): BindOnFluentSyntax<T>;
    whenNamed(name: MetadataName): BindOnFluentSyntax<T>;
    whenNoAncestor(constraint: (metadata: BindingConstraints) => boolean): BindOnFluentSyntax<T>;
    whenNoAncestorIs(serviceIdentifier: ServiceIdentifier): BindOnFluentSyntax<T>;
    whenNoAncestorNamed(name: MetadataName): BindOnFluentSyntax<T>;
    whenNoAncestorTagged(tag: MetadataTag, tagValue: unknown): BindOnFluentSyntax<T>;
    whenNoParent(constraint: (metadata: BindingConstraints) => boolean): BindOnFluentSyntax<T>;
    whenNoParentIs(serviceIdentifier: ServiceIdentifier): BindOnFluentSyntax<T>;
    whenNoParentNamed(name: MetadataName): BindOnFluentSyntax<T>;
    whenNoParentTagged(tag: MetadataTag, tagValue: unknown): BindOnFluentSyntax<T>;
    whenParent(constraint: (metadata: BindingConstraints) => boolean): BindOnFluentSyntax<T>;
    whenParentIs(serviceIdentifier: ServiceIdentifier): BindOnFluentSyntax<T>;
    whenParentNamed(name: MetadataName): BindOnFluentSyntax<T>;
    whenParentTagged(tag: MetadataTag, tagValue: unknown): BindOnFluentSyntax<T>;
    whenTagged(tag: MetadataTag, tagValue: unknown): BindOnFluentSyntax<T>;
}
//# sourceMappingURL=BindingFluentSyntax.d.ts.map