import { Asset, Category, Construct, Frame, FrameGroup, Lane, LaneGroup, Scheme, Script, ViewMode, Container, DockZone } from './Scheme.types';
import { SerializationRule } from './SerializationRule';
interface SchemeBuilderStart {
    addCategory(name: string): SchemeBuilderCategory;
    withSerializationRules(rules: SerializationRule[]): SchemeBuilderStart;
    withViewModes(modes: ViewMode[]): SchemeBuilderStart;
}
interface SchemeBuilderCategory {
    addAsset(asset: Asset): SchemeBuilderCategory;
    addConstruct(construct: Construct): SchemeBuilderConstructStart;
    addCategory(name: string): SchemeBuilderCategory;
    addContainer(container: Container): SchemeBuilderCategory;
    build(): Scheme;
}
interface SchemeBuilderConstructStart extends SchemeBuilderCategory {
    addScript(script: Script): SchemeBuilderScriptStart;
    withZones(zone: DockZone[]): SchemeBuilderConstructStart;
}
interface SchemeBuilderScriptStart {
    addFrameGroup(frameGroup: FrameGroup): SchemeBuilderScriptFrameGroup;
    addLaneGroup(laneGroup: LaneGroup): SchemeBuilderScriptLaneGroup;
    build(): Scheme;
}
interface SchemeBuilderScriptFrameGroup extends SchemeBuilderCategory {
    addFrame(frame: Frame): SchemeBuilderScriptFrameGroup;
    addFrameGroup(frameGroup: FrameGroup): SchemeBuilderScriptFrameGroup;
    addLaneGroup(laneGroup: LaneGroup): SchemeBuilderScriptLaneGroup;
}
interface SchemeBuilderScriptLaneGroup extends SchemeBuilderCategory {
    addLane(lane: Lane): SchemeBuilderScriptLaneGroup;
    addLaneGroup(laneGroup: LaneGroup): SchemeBuilderScriptLaneGroup;
    addFrameGroup(frameGroup: FrameGroup): SchemeBuilderScriptFrameGroup;
}
type SchemeInput = Omit<Scheme, 'categories'> & {
    categories?: Category[];
    serializationRules?: SerializationRule[];
    viewModes?: ViewMode[];
};
export interface ISchemeProvider {
    getScheme(): Scheme;
}
export declare class SchemeBuilder implements SchemeBuilderStart, SchemeBuilderCategory, SchemeBuilderConstructStart, SchemeBuilderScriptStart, SchemeBuilderScriptFrameGroup, SchemeBuilderScriptLaneGroup {
    private readonly scheme;
    private currentCategory?;
    private currentConstruct?;
    private currentScript?;
    private currentFrameGroup?;
    private currentLaneGroup?;
    private constructor();
    static create(scheme: SchemeInput): SchemeBuilderStart;
    withSerializationRules(rules: SerializationRule[]): SchemeBuilderStart;
    withViewModes(modes: ViewMode[]): SchemeBuilderStart;
    addCategory(name: string): SchemeBuilderCategory;
    addConstruct(construct: Construct): SchemeBuilderConstructStart;
    addAsset(asset: Asset): SchemeBuilderCategory;
    addContainer(container: Container): SchemeBuilderCategory;
    withZones(zones: DockZone[]): SchemeBuilderConstructStart;
    addScript(script: Script): SchemeBuilderScriptStart;
    addFrameGroup(frameGroup: FrameGroup): SchemeBuilderScriptFrameGroup;
    addFrame(frame: Frame): SchemeBuilderScriptFrameGroup;
    addLaneGroup(laneGroup: LaneGroup): SchemeBuilderScriptLaneGroup;
    addLane(lane: Lane): SchemeBuilderScriptLaneGroup;
    build(): Scheme;
    private finalizePendingItems;
    private ensureCategoryExists;
    private ensureConstructExists;
    private ensureScriptExists;
    private ensureFrameGroupExists;
    private ensureLaneGroupExists;
}
export {};
