import { GuidValue } from "@omnia/fx-models/internal-do-not-import-from-here/shared/models";
import { IMessageBusTopicSubscription } from "./Messaging";
import { Block, IReactiveLayoutItemsSettingsStore, LoadedLayout } from "./Layout";
interface ILayoutCanvasItemDefinition<T> {
    id: GuidValue;
    createInstance: (layout: LoadedLayout) => Promise<T>;
    /**
    *This influence the order of the items, be nice, use ordering with gap -100, 0, 100, 200
    So other extensions etc can inject between
    */
    weight?: number;
}
interface ILayoutCanvasItemInstance {
    definitionId: GuidValue;
    slots: ILayoutCanvasItemSlot;
}
interface ILayoutCanvasItemSlot {
    header: () => JSX.Element;
    content: () => JSX.Element | JSX.Element[];
}
export interface ILayoutCanvasExpansionItemInstance extends ILayoutCanvasItemInstance {
    slots: ILayoutCanvasItemSlot;
}
export interface ILayoutCanvasTabInstance extends ILayoutCanvasItemInstance {
    slots: ILayoutCanvasItemSlot;
    items: ILayoutCanvasExpansionItemInstance[];
    active?: boolean;
    disabled?: boolean;
    /**
    *Will force the components content to render on mounted. This is useful if you have content that will not be rendered in the DOM that you want crawled for SEO.
    */
    eager?: boolean;
    onClick?: () => void;
}
export interface ILayoutCanvasSectionSettingsPanelDefinition extends ILayoutCanvasSettingsPanelDefinition {
}
export interface ILayoutCanvasBlockSettingsPanelDefinition extends ILayoutCanvasSettingsPanelDefinition {
}
export interface ILayoutCanvasLayoutSettingsPanelDefinition extends ILayoutCanvasSettingsPanelDefinition {
}
export interface ILayoutCanvasSettingsPanelDefinitionSlots {
    body: (items: ILayoutCanvasTabInstance[]) => JSX.Element;
}
export interface ILayoutCanvasExpansionItemDefinitionSlots {
    beforeContent: () => JSX.Element;
    afterContent: () => JSX.Element;
}
export interface ILayoutCanvasTabDefinitionBuilder<T> {
    /**
    *@param weight This influence the order of the items, be nice, use ordering with gap -100, 0, 100, 200
    So other extensions etc can inject between
    */
    add: (tab: ILayoutCanvasTabDefinition) => ILayoutCanvasTabDefinitionBuilder<T>;
    remove: (tab: GuidValue) => ILayoutCanvasTabDefinitionBuilder<T>;
    update: (tabId: GuidValue) => ILayoutCanvasTabItemsDefinitionBuilder<ILayoutCanvasTabDefinition>;
    sort: (compareFn: (a: ILayoutCanvasTabDefinition, b: ILayoutCanvasTabDefinition) => number) => ILayoutCanvasTabDefinitionBuilder<T>;
    done: () => T;
}
export interface ILayoutCanvasTabItemsDefinitionBuilder<T> {
    reset: () => ILayoutCanvasTabItemsDefinitionBuilder<T>;
    add: (item: ILayoutCanvasExpansionItemDefinition) => ILayoutCanvasTabItemsDefinitionBuilder<T>;
    remove: (itemId: GuidValue) => ILayoutCanvasTabItemsDefinitionBuilder<T>;
    sort: (compareFn: (a: ILayoutCanvasExpansionItemDefinition, b: ILayoutCanvasExpansionItemDefinition) => number) => ILayoutCanvasTabItemsDefinitionBuilder<T>;
    done: () => T;
    update: (itemId: GuidValue) => ILayoutCanvasExpansionItemDefinitionBuilder<ILayoutCanvasTabItemsDefinitionBuilder<T>>;
}
export interface ILayoutCanvasExpansionItemDefinitionBuilder<T> {
    slots: (slots: ILayoutCanvasExpansionItemDefinitionSlots) => ILayoutCanvasExpansionItemDefinitionBuilder<T>;
    done: () => T;
}
export interface ILayoutCanvasSettingsPanelDefinition {
    reset: () => ILayoutCanvasSettingsPanelDefinition;
    slots: (slots: ILayoutCanvasSettingsPanelDefinitionSlots) => ILayoutCanvasSettingsPanelDefinition;
    tabs: () => ILayoutCanvasTabDefinitionBuilder<ILayoutCanvasSettingsPanelDefinition>;
    result: () => {
        tabs: ILayoutCanvasTabDefinition[];
        slots: Partial<ILayoutCanvasSettingsPanelDefinitionSlots>;
    };
    done: () => ILayoutCanvasSettingsPanel;
}
export interface ILayoutCanvasExpansionItemDefinition extends ILayoutCanvasItemDefinition<ILayoutCanvasExpansionItemInstance> {
    slots: ILayoutCanvasExpansionItemDefinitionSlots;
}
export interface ILayoutCanvasTabDefinition extends ILayoutCanvasItemDefinition<ILayoutCanvasTabInstance> {
    items: ILayoutCanvasExpansionItemDefinition[];
    createInstance: (layout: LoadedLayout, block?: Block, blockSettingsStore?: IReactiveLayoutItemsSettingsStore) => Promise<ILayoutCanvasTabInstance>;
    hooks: {
        beforeCreate: IMessageBusTopicSubscription<ILayoutCanvasTabDefinition>;
        created: IMessageBusTopicSubscription<ILayoutCanvasTabInstance>;
    };
}
export interface ILayoutCanvasDefinitionBuilder {
    panels: () => ILayoutCanvasSettingsPanel;
}
export interface ILayoutCanvasSettingsPanel {
    section: () => ILayoutCanvasSettingsPanelDefinition;
    layout: () => ILayoutCanvasLayoutSettingsPanelDefinition;
    block: () => ILayoutCanvasSettingsPanelDefinition;
    done: () => ILayoutCanvasDefinitionBuilder;
}
export {};
