import { KeyValue, Size, Basecoat } from '@antv/x6-common';
import { Rectangle, Point } from '@antv/x6-geometry';
import { NonUndefined } from 'utility-types';
import { Attr } from '../registry';
import { Model } from './model';
import { PortManager } from './port';
import { Store } from './store';
import { Edge } from './edge';
import { Animation } from './animation';
import { CellView, Markup } from '../view';
import { Node } from './node';
import { Graph } from '../graph';
export declare class Cell<Properties extends Cell.Properties = Cell.Properties> extends Basecoat<Cell.EventArgs> {
    protected static markup: Markup;
    protected static defaults: Cell.Defaults;
    protected static attrHooks: Attr.Definitions;
    protected static propHooks: Cell.PropHook[];
    static config<C extends Cell.Config = Cell.Config>(presets: C): void;
    static getMarkup(): Markup;
    static getDefaults<T extends Cell.Defaults = Cell.Defaults>(raw?: boolean): T;
    static getAttrHooks(): Attr.Definitions;
    static applyPropHooks(cell: Cell, metadata: Cell.Metadata): Cell.Metadata;
    protected get [Symbol.toStringTag](): string;
    readonly id: string;
    protected readonly store: Store<Cell.Properties>;
    protected readonly animation: Animation;
    protected _model: Model | null;
    protected _parent: Cell | null;
    protected _children: Cell[] | null;
    constructor(metadata?: Cell.Metadata);
    init(): void;
    get model(): Model | null;
    set model(model: Model | null);
    protected preprocess(metadata: Cell.Metadata, ignoreIdCheck?: boolean): Properties;
    protected postprocess(metadata: Cell.Metadata): void;
    protected setup(): void;
    notify<Key extends keyof Cell.EventArgs>(name: Key, args: Cell.EventArgs[Key]): this;
    notify(name: Exclude<string, keyof Cell.EventArgs>, args: any): this;
    isNode(): this is Node;
    isEdge(): this is Edge;
    isSameStore(cell: Cell): boolean;
    get view(): string | undefined;
    get shape(): string;
    getProp(): Properties;
    getProp<K extends keyof Properties>(key: K): Properties[K];
    getProp<K extends keyof Properties>(key: K, defaultValue: Properties[K]): NonUndefined<Properties[K]>;
    getProp<T>(key: string): T;
    getProp<T>(key: string, defaultValue: T): T;
    setProp<K extends keyof Properties>(key: K, value: Properties[K] | null | undefined | void, options?: Cell.SetOptions): this;
    setProp(key: string, value: any, options?: Cell.SetOptions): this;
    setProp(props: Partial<Properties>, options?: Cell.SetOptions): this;
    removeProp<K extends keyof Properties>(key: K | K[], options?: Cell.SetOptions): this;
    removeProp(key: string | string[], options?: Cell.SetOptions): this;
    removeProp(options?: Cell.SetOptions): this;
    hasChanged(): boolean;
    hasChanged<K extends keyof Properties>(key: K | null): boolean;
    hasChanged(key: string | null): boolean;
    getPropByPath<T>(path: string | string[]): T;
    setPropByPath(path: string | string[], value: any, options?: Cell.SetByPathOptions): this;
    removePropByPath(path: string | string[], options?: Cell.SetOptions): this;
    prop(): Properties;
    prop<K extends keyof Properties>(key: K): Properties[K];
    prop<T>(key: string): T;
    prop<T>(path: string[]): T;
    prop<K extends keyof Properties>(key: K, value: Properties[K] | null | undefined | void, options?: Cell.SetOptions): this;
    prop(key: string, value: any, options?: Cell.SetOptions): this;
    prop(path: string[], value: any, options?: Cell.SetOptions): this;
    prop(props: Partial<Properties>, options?: Cell.SetOptions): this;
    previous<K extends keyof Properties>(name: K): Properties[K] | undefined;
    previous<T>(name: string): T | undefined;
    get zIndex(): number | undefined | null;
    set zIndex(z: number | undefined | null);
    getZIndex(): number | undefined;
    setZIndex(z: number, options?: Cell.SetOptions): this;
    removeZIndex(options?: Cell.SetOptions): this;
    toFront(options?: Cell.ToFrontOptions): this;
    toBack(options?: Cell.ToBackOptions): this;
    get markup(): Markup | undefined | null;
    set markup(value: Markup | undefined | null);
    getMarkup(): Markup;
    setMarkup(markup: Markup, options?: Cell.SetOptions): this;
    removeMarkup(options?: Cell.SetOptions): this;
    get attrs(): Attr.CellAttrs | null | undefined;
    set attrs(value: Attr.CellAttrs | null | undefined);
    getAttrs(): {
        [x: string]: Attr.ComplexAttrs;
    };
    setAttrs(attrs: Attr.CellAttrs | null | undefined, options?: Cell.SetAttrOptions): this;
    replaceAttrs(attrs: Attr.CellAttrs, options?: Cell.SetOptions): this;
    updateAttrs(attrs: Attr.CellAttrs, options?: Cell.SetOptions): this;
    removeAttrs(options?: Cell.SetOptions): this;
    getAttrDefinition(attrName: string): string | Attr.Qualify | null;
    getAttrByPath(): Attr.CellAttrs;
    getAttrByPath<T>(path: string | string[]): T;
    setAttrByPath(path: string | string[], value: Attr.ComplexAttrValue, options?: Cell.SetOptions): this;
    removeAttrByPath(path: string | string[], options?: Cell.SetOptions): this;
    protected prefixAttrPath(path: string | string[]): string | string[];
    attr(): Attr.CellAttrs;
    attr<T>(path: string | string[]): T;
    attr(path: string | string[], value: Attr.ComplexAttrValue | null, options?: Cell.SetOptions): this;
    attr(attrs: Attr.CellAttrs, options?: Cell.SetAttrOptions): this;
    get visible(): boolean;
    set visible(value: boolean);
    setVisible(visible: boolean, options?: Cell.SetOptions): this;
    isVisible(): boolean;
    show(options?: Cell.SetOptions): this;
    hide(options?: Cell.SetOptions): this;
    toggleVisible(visible: boolean, options?: Cell.SetOptions): this;
    toggleVisible(options?: Cell.SetOptions): this;
    get data(): Properties['data'];
    set data(val: Properties['data']);
    getData<T = Properties['data']>(): T;
    setData<T = Properties['data']>(data: T, options?: Cell.SetDataOptions): this;
    replaceData<T = Properties['data']>(data: T, options?: Cell.SetOptions): this;
    updateData<T = Properties['data']>(data: T, options?: Cell.SetOptions): this;
    removeData(options?: Cell.SetOptions): this;
    get parent(): Cell | null;
    get children(): Cell<Cell.Properties>[] | null;
    getParentId(): string | undefined;
    getParent<T extends Cell = Cell>(): T | null;
    getChildren(): Cell<Cell.Properties>[] | null;
    hasParent(): boolean;
    isParentOf(child: Cell | null): boolean;
    isChildOf(parent: Cell | null): boolean;
    eachChild(iterator: (child: Cell, index: number, children: Cell[]) => void, context?: any): this;
    filterChild(filter: (cell: Cell, index: number, arr: Cell[]) => boolean, context?: any): Cell[];
    getChildCount(): number;
    getChildIndex(child: Cell): number;
    getChildAt(index: number): Cell<Cell.Properties> | null;
    getAncestors(options?: {
        deep?: boolean;
    }): Cell[];
    getDescendants(options?: Cell.GetDescendantsOptions): Cell[];
    isDescendantOf(ancestor: Cell | null, options?: {
        deep?: boolean;
    }): boolean;
    isAncestorOf(descendant: Cell | null, options?: {
        deep?: boolean;
    }): boolean;
    contains(cell: Cell | null): boolean;
    getCommonAncestor(...cells: (Cell | null | undefined)[]): Cell | null;
    setParent(parent: Cell | null, options?: Cell.SetOptions): this;
    setChildren(children: Cell[] | null, options?: Cell.SetOptions): this;
    unembed(child: Cell, options?: Cell.SetOptions): this;
    embed(child: Cell, options?: Cell.SetOptions): this;
    addTo(model: Model, options?: Cell.SetOptions): this;
    addTo(graph: Graph, options?: Cell.SetOptions): this;
    addTo(parent: Cell, options?: Cell.SetOptions): this;
    insertTo(parent: Cell, index?: number, options?: Cell.SetOptions): this;
    addChild(child: Cell | null, options?: Cell.SetOptions): this;
    insertChild(child: Cell | null, index?: number, options?: Cell.SetOptions): this;
    removeFromParent(options?: Cell.RemoveOptions): this;
    removeChild(child: Cell, options?: Cell.RemoveOptions): Cell<Cell.Properties> | null;
    removeChildAt(index: number, options?: Cell.RemoveOptions): Cell<Cell.Properties> | null;
    remove(options?: Cell.RemoveOptions): this;
    transition<K extends keyof Properties>(path: K, target: Properties[K], options?: Animation.StartOptions<Properties[K]>, delim?: string): () => void;
    transition<T extends Animation.TargetValue>(path: string | string[], target: T, options?: Animation.StartOptions<T>, delim?: string): () => void;
    stopTransition<T extends Animation.TargetValue>(path: string | string[], options?: Animation.StopOptions<T>, delim?: string): this;
    getTransitions(): string[];
    translate(tx: number, ty: number, options?: Cell.TranslateOptions): this;
    scale(sx: number, // eslint-disable-line
    sy: number, // eslint-disable-line
    origin?: Point | Point.PointLike, // eslint-disable-line
    options?: Node.SetOptions): this;
    addTools(items: Cell.ToolItem | Cell.ToolItem[], options?: Cell.AddToolOptions): void;
    addTools(items: Cell.ToolItem | Cell.ToolItem[], name: string, options?: Cell.AddToolOptions): void;
    setTools(tools?: Cell.ToolsLoose | null, options?: Cell.SetOptions): this;
    getTools(): Cell.Tools | null;
    removeTools(options?: Cell.SetOptions): this;
    hasTools(name?: string): boolean;
    hasTool(name: string): boolean;
    removeTool(name: string, options?: Cell.SetOptions): this;
    removeTool(index: number, options?: Cell.SetOptions): this;
    getBBox(options?: {
        deep?: boolean;
    }): Rectangle;
    getConnectionPoint(edge: Edge, type: Edge.TerminalType): Point;
    toJSON(options?: Cell.ToJSONOptions): this extends Node ? Node.Properties : this extends Edge ? Edge.Properties : Properties;
    clone(options?: Cell.CloneOptions): this extends Node ? Node : this extends Edge ? Edge : Cell;
    findView(graph: Graph): CellView | null;
    startBatch(name: Model.BatchName, data?: KeyValue, model?: Model | null): this;
    stopBatch(name: Model.BatchName, data?: KeyValue, model?: Model | null): this;
    batchUpdate<T>(name: Model.BatchName, execute: () => T, data?: KeyValue): T;
    dispose(): void;
}
export declare namespace Cell {
    interface Common {
        view?: string;
        shape?: string;
        markup?: Markup;
        attrs?: Attr.CellAttrs;
        zIndex?: number;
        visible?: boolean;
        data?: any;
    }
    interface Defaults extends Common {
    }
    interface Metadata extends Common, KeyValue {
        id?: string;
        tools?: ToolsLoose;
    }
    interface Properties extends Defaults, Metadata {
        parent?: string;
        children?: string[];
        tools?: Tools;
    }
}
export declare namespace Cell {
    type ToolItem = string | {
        name: string;
        args?: any;
    };
    interface Tools {
        name?: string | null;
        local?: boolean;
        items: ToolItem[];
    }
    type ToolsLoose = ToolItem | ToolItem[] | Tools;
    function normalizeTools(raw: ToolsLoose): Tools;
}
export declare namespace Cell {
    interface SetOptions extends Store.SetOptions {
    }
    interface MutateOptions extends Store.MutateOptions {
    }
    interface RemoveOptions extends SetOptions {
        deep?: boolean;
    }
    interface SetAttrOptions extends SetOptions {
        deep?: boolean;
        overwrite?: boolean;
    }
    interface SetDataOptions extends SetOptions {
        deep?: boolean;
        overwrite?: boolean;
    }
    interface SetByPathOptions extends Store.SetByPathOptions {
    }
    interface ToFrontOptions extends SetOptions {
        deep?: boolean;
    }
    interface ToBackOptions extends ToFrontOptions {
    }
    interface TranslateOptions extends SetOptions {
        tx?: number;
        ty?: number;
        translateBy?: string | number;
    }
    interface AddToolOptions extends SetOptions {
        reset?: boolean;
        local?: boolean;
    }
    interface GetDescendantsOptions {
        deep?: boolean;
        breadthFirst?: boolean;
    }
    interface ToJSONOptions {
        diff?: boolean;
    }
    interface CloneOptions {
        deep?: boolean;
        keepId?: boolean;
    }
}
export declare namespace Cell {
    export interface EventArgs {
        'transition:start': Animation.CallbackArgs<Animation.TargetValue>;
        'transition:progress': Animation.ProgressArgs<Animation.TargetValue>;
        'transition:complete': Animation.CallbackArgs<Animation.TargetValue>;
        'transition:stop': Animation.StopArgs<Animation.TargetValue>;
        'transition:finish': Animation.CallbackArgs<Animation.TargetValue>;
        'change:*': ChangeAnyKeyArgs;
        'change:attrs': ChangeArgs<Attr.CellAttrs>;
        'change:zIndex': ChangeArgs<number>;
        'change:markup': ChangeArgs<Markup>;
        'change:visible': ChangeArgs<boolean>;
        'change:parent': ChangeArgs<string>;
        'change:children': ChangeArgs<string[]>;
        'change:tools': ChangeArgs<Tools>;
        'change:view': ChangeArgs<string>;
        'change:data': ChangeArgs<any>;
        'change:size': NodeChangeArgs<Size>;
        'change:angle': NodeChangeArgs<number>;
        'change:position': NodeChangeArgs<Point.PointLike>;
        'change:ports': NodeChangeArgs<PortManager.Port[]>;
        'change:portMarkup': NodeChangeArgs<Markup>;
        'change:portLabelMarkup': NodeChangeArgs<Markup>;
        'change:portContainerMarkup': NodeChangeArgs<Markup>;
        'ports:removed': {
            cell: Cell;
            node: Node;
            removed: PortManager.Port[];
        };
        'ports:added': {
            cell: Cell;
            node: Node;
            added: PortManager.Port[];
        };
        'change:source': EdgeChangeArgs<Edge.TerminalData>;
        'change:target': EdgeChangeArgs<Edge.TerminalData>;
        'change:terminal': EdgeChangeArgs<Edge.TerminalData> & {
            type: Edge.TerminalType;
        };
        'change:router': EdgeChangeArgs<Edge.RouterData>;
        'change:connector': EdgeChangeArgs<Edge.ConnectorData>;
        'change:vertices': EdgeChangeArgs<Point.PointLike[]>;
        'change:labels': EdgeChangeArgs<Edge.Label[]>;
        'change:defaultLabel': EdgeChangeArgs<Edge.Label>;
        'vertexs:added': {
            cell: Cell;
            edge: Edge;
            added: Point.PointLike[];
        };
        'vertexs:removed': {
            cell: Cell;
            edge: Edge;
            removed: Point.PointLike[];
        };
        'labels:added': {
            cell: Cell;
            edge: Edge;
            added: Edge.Label[];
        };
        'labels:removed': {
            cell: Cell;
            edge: Edge;
            removed: Edge.Label[];
        };
        'batch:start': {
            name: Model.BatchName;
            data: KeyValue;
            cell: Cell;
        };
        'batch:stop': {
            name: Model.BatchName;
            data: KeyValue;
            cell: Cell;
        };
        changed: {
            cell: Cell;
            options: MutateOptions;
        };
        added: {
            cell: Cell;
            index: number;
            options: Cell.SetOptions;
        };
        removed: {
            cell: Cell;
            index: number;
            options: Cell.RemoveOptions;
        };
    }
    interface ChangeAnyKeyArgs<T extends keyof Properties = keyof Properties> {
        key: T;
        current: Properties[T];
        previous: Properties[T];
        options: MutateOptions;
        cell: Cell;
    }
    export interface ChangeArgs<T> {
        cell: Cell;
        current?: T;
        previous?: T;
        options: MutateOptions;
    }
    interface NodeChangeArgs<T> extends ChangeArgs<T> {
        node: Node;
    }
    interface EdgeChangeArgs<T> extends ChangeArgs<T> {
        edge: Edge;
    }
    export {};
}
export declare namespace Cell {
    const toStringTag: string;
    function isCell(instance: any): instance is Cell;
}
export declare namespace Cell {
    function getCommonAncestor(...cells: (Cell | null | undefined)[]): Cell | null;
    interface GetCellsBBoxOptions {
        deep?: boolean;
    }
    function getCellsBBox(cells: Cell[], options?: GetCellsBBoxOptions): Rectangle | null;
    function deepClone(cell: Cell): KeyValue<Cell<Properties>>;
    function cloneCells(cells: Cell[]): KeyValue<Cell<Properties>>;
}
export declare namespace Cell {
    type Definition = typeof Cell;
    type PropHook<M extends Metadata = Metadata, C extends Cell = Cell> = (this: C, metadata: M) => M;
    type PropHooks<M extends Metadata = Metadata, C extends Cell = Cell> = KeyValue<PropHook<M, C>> | PropHook<M, C> | PropHook<M, C>[];
    interface Config<M extends Metadata = Metadata, C extends Cell = Cell> extends Defaults, KeyValue {
        constructorName?: string;
        overwrite?: boolean;
        propHooks?: PropHooks<M, C>;
        attrHooks?: Attr.Definitions;
    }
}
export declare namespace Cell {
}