import { IEditBoxBase, IUI, IRectInputData, IGroup, IBoundsData, IBounds, IPointerEvent, IRect, IMatrix, IFunction, IEditorBase, IObject, IEventListenerId, IEvent, IPointData, IMatrixData, IAround, IDragEvent, IImageData, IImageInputData, IBoxInputData, IFourNumber, IAxisAlign, IFlowWrap, IGap, IFlowAlign } from '@leafer-ui/interface';
export * from '@leafer-ui/interface';

interface IEditBox extends IEditBoxBase {
    editor: IEditor;
}

interface IStroker extends IUI {
    target: IUI | IUI[];
    update(): void;
    setTarget(target: IUI | IUI[], style: IRectInputData): void;
}

interface ISelectArea extends IGroup {
    setStyle(style: IRectInputData, userStyle?: IRectInputData): void;
    setBounds(bounds: IBoundsData): void;
}

interface IEditSelect extends IGroup {
    editor: IEditor;
    dragging: boolean;
    running: boolean;
    hoverStroker: IStroker;
    targetStroker: IStroker;
    selectArea: ISelectArea;
    bounds: IBounds;
    findUI(e: IPointerEvent): IUI;
    findDeepOne(e: IPointerEvent): IUI;
    update(): void;
}

interface ISimulateElement extends IRect {
    checkChange: boolean;
    canChange: boolean;
    changedTransform: IMatrix;
    safeChange(fn: IFunction): void;
}

interface IEditor extends IEditorBase {
    simulateTarget: ISimulateElement;
    selector: IEditSelect;
    editBox: IEditBox;
    editTool?: IEditTool;
    innerEditor?: IInnerEditor;
    targetEventIds: IEventListenerId[];
    checkOpenedGroups(): void;
    listenTargetEvents(): void;
    removeTargetEvents(): void;
}
interface IEditTool extends IInnerEditor {
    onMove(e: IEditorMoveEvent): void;
    onScale(e: IEditorScaleEvent): void;
    onScaleWithDrag?(e: IEditorScaleEvent): void;
    onRotate(e: IEditorRotateEvent): void;
    onSkew(e: IEditorSkewEvent): void;
}
interface IInnerEditor {
    tag: string;
    editTarget: IUI;
    config: IObject;
    editor: IEditor;
    editBox: IEditBox;
    view: IGroup;
    eventIds: IEventListenerId[];
    onCreate(): void;
    create(): void;
    onLoad(): void;
    load(): void;
    onLoad(): void;
    unload(): void;
    onUpdate(): void;
    update(): void;
    onDestroy(): void;
    destroy(): void;
}
interface IEditorEvent extends IEvent {
    readonly target?: IUI;
    readonly editor?: IEditor;
    readonly value?: IUI | IUI[];
    readonly oldValue?: IUI | IUI[];
    readonly list?: IUI[];
    readonly oldList?: IUI[];
    readonly worldOrigin?: IPointData;
    readonly origin?: IPointData;
}
interface IInnerEditorEvent extends IEditorEvent {
    editTarget: IUI;
    innerEditor: IInnerEditor;
}
interface IEditorGroupEvent extends IEditorEvent {
    editTarget: IGroup;
}
interface IEditorMoveEvent extends IEditorEvent {
    readonly moveX: number;
    readonly moveY: number;
}
interface IEditorScaleEvent extends IEditorEvent {
    readonly scaleX?: number;
    readonly scaleY?: number;
    transform?: IMatrixData;
    readonly direction?: number;
    readonly lockRatio?: boolean | 'corner';
    readonly around?: IAround;
    drag?: IDragEvent;
}
interface IEditorRotateEvent extends IEditorEvent {
    transform?: IMatrixData;
    readonly rotation?: number;
}
interface IEditorSkewEvent extends IEditorEvent {
    transform?: IMatrixData;
    readonly skewX?: number;
    readonly skewY?: number;
}

interface IHTMLTextAttrData {
    text?: string;
    __htmlChanged?: boolean;
}
interface IHTMLTextData extends IHTMLTextAttrData, IImageData {
}
interface IHTMLTextInputData extends IHTMLTextAttrData, IImageInputData {
}

interface IScrollBarConfig {
    theme?: IScrollBarTheme;
    padding?: IFourNumber;
    minSize?: number;
}
type IScrollBarTheme = 'light' | 'dark' | IBoxInputData;
interface IScrollBar extends IGroup {
    config: IScrollBarConfig;
    changeTheme(theme: IScrollBarTheme): void;
    update(check: boolean): void;
}

interface IFlowWrapDrawData extends IGapBoundsData {
    list: IFlowDrawData[];
}
interface IFlowDrawData extends IGapBoundsData {
    start: number;
    grow: number;
    hasRangeSize?: boolean;
}
interface IGapBoundsData extends IBoundsData {
    count: number;
    gap: number;
}
interface IFlowAlignToAxisAlignMap {
    [name: string]: IAxisAlign;
}
interface IFlowParseData {
    complex: boolean;
    wrap: IFlowWrap;
    xGap: IGap;
    yGap: IGap;
    isAutoXGap: boolean;
    isAutoYGap: boolean;
    isFitXGap: boolean;
    isFitYGap: boolean;
    contentAlign: IFlowAlign;
    rowXAlign: IAxisAlign;
    rowYAlign: IAxisAlign;
}

export type { IEditBox, IEditSelect, IEditTool, IEditor, IEditorEvent, IEditorGroupEvent, IEditorMoveEvent, IEditorRotateEvent, IEditorScaleEvent, IEditorSkewEvent, IFlowAlignToAxisAlignMap, IFlowDrawData, IFlowParseData, IFlowWrapDrawData, IGapBoundsData, IHTMLTextData, IHTMLTextInputData, IInnerEditor, IInnerEditorEvent, IScrollBar, IScrollBarConfig, IScrollBarTheme, ISelectArea, ISimulateElement, IStroker };
