import type { AnyRecord } from '../../../framework-types/BaseTypes';
import type { ContextHaving } from '../../../framework-types/execution-context/Types';
import type { NamedTask, Task } from '../../../framework-types/task/Types';
import type { BaseContext } from '../../../framework-types/Types';
import type { EmptyObject } from '../../Types';
import type { Constants, PlaybackTechnology, ResourceType } from '../core/Constants';
import type { CoreEffects, CoreExportNames } from '../core/Types';
import type { Resource } from '../source/atoms/SourceConfigAtom';
import type { SourceStateAtom } from '../source/atoms/SourceStateAtom';
import type { SourceExportNames } from '../source/Types';
import type { ContextWithState } from '../Types';
export declare enum PlaybackTechnologyEntryType {
    Presentation = "presentation",
    Manifest = "manifest"
}
export declare function isManifestEntry(entry: TechnologyEntry): entry is ManifestTechnologyEntry;
export declare function isPresentationEntry(entry: TechnologyEntry): entry is PresentationTechnologyEntry;
export interface TechnologyEntryBase<Exports extends AnyRecord = EmptyObject> {
        type: PlaybackTechnologyEntryType;
        name: string;
        depends: PlaybackTechnologyEntryType[];
        supported: (resource: Resource, playbackTechnology?: PlaybackTechnology) => boolean;
        instantiate: NamedTask<Task<ContextHaving<PlaybackTechnologyDependencies, Exports, ContextWithState>, Resource, void>>;
}
export type PresentationTechnologyEntry<Exports extends AnyRecord = EmptyObject> = TechnologyEntryBase<Exports> & {
        type: PlaybackTechnologyEntryType.Presentation;
        supported: (resource: Resource, playbackTechnology: PlaybackTechnology) => boolean;
};
export type ManifestTechnologyEntry<Exports extends AnyRecord = EmptyObject> = TechnologyEntryBase<Exports> & {
        type: PlaybackTechnologyEntryType.Manifest;
        supported: (resource: Resource) => boolean;
};
export type TechnologyEntry<Exports extends AnyRecord = EmptyObject> = PresentationTechnologyEntry<Exports> | ManifestTechnologyEntry<Exports>;
export interface TechnologyChain {
    technologies: TechnologyEntry[];
    playbackTechnology: PlaybackTechnology;
}
export type TechnologyPriority = {
    manifest: ResourceType[];
    playback: PlaybackTechnology[];
};
export type PlaybackTechnologyDependencies = {
    [SourceExportNames.SourceState]: SourceStateAtom;
    [CoreExportNames.CoreEffects]: CoreEffects;
    [CoreExportNames.Constants]: Constants;
};
export type PlaybackTechnologyContext = ContextHaving<PlaybackTechnologyDependencies, EmptyObject, ContextWithState>;
export interface PlaybackTechnologyComponent {
        addTechnology: NamedTask<Task<BaseContext, TechnologyEntry<AnyRecord>, void>>;
}
export declare const PlaybackTechnologyComponent = "playback-technology-component";
export type PlaybackTechnologyExports = {
    [PlaybackTechnologyComponent]: PlaybackTechnologyComponent;
};
