import type { ProjectionPresentation, ProjectionRequest, ProjectionSnapshot, ProjectionWriteOptions, ViewportProjectionAdapter } from './ViewportProjectionTypes.js';
import { ViewportType } from '../../enums/index.js';
import type { ViewPresentation } from '../../types/index.js';
import type { PlanarProjectionRequest, PlanarProjectionSnapshot } from './Planar/PlanarProjectionTypes.js';
import type { PlanarViewPresentation, PlanarViewState } from './Planar/PlanarViewportTypes.js';
import type { Volume3DProjectionPresentation, Volume3DProjectionRequest, Volume3DProjectionSnapshot } from './Volume3D/Volume3DProjectionTypes.js';
import type { Volume3DCamera } from './Volume3D/viewport3DTypes.js';
import type { VideoProjectionRequest, VideoProjectionSnapshot } from './Video/VideoProjectionTypes.js';
import type { VideoViewState } from './Video/VideoViewportTypes.js';
import type { ECGProjectionRequest, ECGProjectionSnapshot } from './ECG/ECGProjectionTypes.js';
import type { ECGViewState } from './ECG/ECGViewportTypes.js';
import type { WSIProjectionRequest, WSIProjectionSnapshot } from './WSI/WSIProjectionTypes.js';
import type { WSIViewState } from './WSI/WSIViewportTypes.js';
type RegisteredProjectionAdapter = ViewportProjectionAdapter<unknown, unknown, ProjectionSnapshot<unknown, ProjectionPresentation<unknown>>>;
export type BuiltInViewportProjectionByKind = {
    planar: {
        presentation: PlanarViewPresentation;
        request: PlanarProjectionRequest;
        snapshot: PlanarProjectionSnapshot;
        viewState: PlanarViewState;
        viewportType: ViewportType.PLANAR_NEXT;
    };
    volume3d: {
        presentation: Volume3DProjectionPresentation;
        request: Volume3DProjectionRequest;
        snapshot: Volume3DProjectionSnapshot;
        viewState: Volume3DCamera;
        viewportType: ViewportType.VOLUME_3D_NEXT;
    };
    video: {
        presentation: ViewPresentation;
        request: VideoProjectionRequest;
        snapshot: VideoProjectionSnapshot;
        viewState: VideoViewState;
        viewportType: ViewportType.VIDEO_NEXT;
    };
    ecg: {
        presentation: ViewPresentation;
        request: ECGProjectionRequest;
        snapshot: ECGProjectionSnapshot;
        viewState: ECGViewState;
        viewportType: ViewportType.ECG_NEXT;
    };
    wsi: {
        presentation: ViewPresentation;
        request: WSIProjectionRequest;
        snapshot: WSIProjectionSnapshot;
        viewState: WSIViewState;
        viewportType: ViewportType.WHOLE_SLIDE_NEXT;
    };
};
export type BuiltInViewportProjectionKind = keyof BuiltInViewportProjectionByKind;
export type BuiltInViewportProjectionByType = {
    [ViewportType.PLANAR_NEXT]: BuiltInViewportProjectionByKind['planar'];
    [ViewportType.VOLUME_3D_NEXT]: BuiltInViewportProjectionByKind['volume3d'];
    [ViewportType.VIDEO_NEXT]: BuiltInViewportProjectionByKind['video'];
    [ViewportType.ECG_NEXT]: BuiltInViewportProjectionByKind['ecg'];
    [ViewportType.WHOLE_SLIDE_NEXT]: BuiltInViewportProjectionByKind['wsi'];
};
export type BuiltInViewportProjectionType = keyof BuiltInViewportProjectionByType;
export type ProjectionSnapshotForKind<TKind extends BuiltInViewportProjectionKind> = BuiltInViewportProjectionByKind[TKind]['snapshot'];
export type ProjectionPresentationForKind<TKind extends BuiltInViewportProjectionKind> = BuiltInViewportProjectionByKind[TKind]['presentation'];
export type ProjectionViewStateForKind<TKind extends BuiltInViewportProjectionKind> = BuiltInViewportProjectionByKind[TKind]['viewState'];
export type ProjectionSnapshotForViewportType<TViewportType extends BuiltInViewportProjectionType> = BuiltInViewportProjectionByType[TViewportType]['snapshot'];
export type ProjectionPresentationForViewportType<TViewportType extends BuiltInViewportProjectionType> = BuiltInViewportProjectionByType[TViewportType]['presentation'];
export type ProjectionViewStateForViewportType<TViewportType extends BuiltInViewportProjectionType> = BuiltInViewportProjectionByType[TViewportType]['viewState'];
type BuiltInProjectionViewport = {
    type: BuiltInViewportProjectionType;
};
type ProjectionForViewport<TViewport> = TViewport extends {
    type: infer TViewportType;
} ? TViewportType extends BuiltInViewportProjectionType ? BuiltInViewportProjectionByType[TViewportType] : never : never;
type ProjectionRequestForKind<TKind extends BuiltInViewportProjectionKind> = Omit<BuiltInViewportProjectionByKind[TKind]['request'], 'viewport'> & {
    kind: TKind;
};
type ProjectionRequestForViewport<TViewport extends BuiltInProjectionViewport> = Omit<ProjectionForViewport<TViewport>['request'], 'viewport'>;
export type ProjectionSnapshotForViewport<TViewport extends BuiltInProjectionViewport> = ProjectionForViewport<TViewport>['snapshot'];
export type ProjectionPresentationForViewport<TViewport extends BuiltInProjectionViewport> = ProjectionForViewport<TViewport>['presentation'];
export type ProjectionViewStateForViewport<TViewport extends BuiltInProjectionViewport> = ProjectionForViewport<TViewport>['viewState'];
declare class ViewportProjectionService {
    private readonly adapters;
    register<TViewState, TPresentation, TSnapshot extends ProjectionSnapshot<TViewState, ProjectionPresentation<unknown>>>(adapter: ViewportProjectionAdapter<TViewState, TPresentation, TSnapshot>): void;
    unregister(adapterId: string): void;
    getAdapter(viewport: unknown, request?: Omit<ProjectionRequest, 'viewport'>): RegisteredProjectionAdapter | undefined;
    get<TKind extends BuiltInViewportProjectionKind>(viewport: unknown, request: ProjectionRequestForKind<TKind>): ProjectionSnapshotForKind<TKind> | undefined;
    get<TViewport extends BuiltInProjectionViewport>(viewport: TViewport, request?: ProjectionRequestForViewport<TViewport>): ProjectionSnapshotForViewport<TViewport> | undefined;
    get<TSnapshot extends ProjectionSnapshot = ProjectionSnapshot>(viewport: unknown, request?: Omit<ProjectionRequest, 'viewport'>): TSnapshot | undefined;
    getPresentation<TKind extends BuiltInViewportProjectionKind>(viewport: unknown, request: ProjectionRequestForKind<TKind>): ProjectionPresentationForKind<TKind> | undefined;
    getPresentation<TViewport extends BuiltInProjectionViewport>(viewport: TViewport, request?: ProjectionRequestForViewport<TViewport>): ProjectionPresentationForViewport<TViewport> | undefined;
    getPresentation<TPresentation = unknown>(viewport: unknown, request?: Omit<ProjectionRequest, 'viewport'>): TPresentation | undefined;
    withPresentation<TKind extends BuiltInViewportProjectionKind>(viewport: unknown, presentation: Partial<ProjectionPresentationForKind<TKind>>, request: ProjectionRequestForKind<TKind>, options?: ProjectionWriteOptions): ProjectionViewStateForKind<TKind> | undefined;
    withPresentation<TViewport extends BuiltInProjectionViewport>(viewport: TViewport, presentation: Partial<ProjectionPresentationForViewport<TViewport>>, request?: ProjectionRequestForViewport<TViewport>, options?: ProjectionWriteOptions): ProjectionViewStateForViewport<TViewport> | undefined;
    withPresentation<TViewState = unknown, TPresentation = unknown>(viewport: unknown, presentation: Partial<TPresentation>, request?: Omit<ProjectionRequest, 'viewport'>, options?: ProjectionWriteOptions): TViewState | undefined;
    getRegisteredAdapters(): RegisteredProjectionAdapter[];
    clear(): void;
}
declare const viewportProjection: ViewportProjectionService;
export { ViewportProjectionService, viewportProjection };
