import { NzSafeAny } from 'ng-zorro-antd/core/types';
import { BehaviorSubject } from 'rxjs';
import * as i0 from '@angular/core';
import { InjectionToken } from '@angular/core';

/**
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
 */

interface NzFormatEmitEvent {
    eventName: string;
    node?: NzTreeNode | null;
    event?: MouseEvent | DragEvent | null;
    dragNode?: NzTreeNode;
    selectedKeys?: NzTreeNode[];
    checkedKeys?: NzTreeNode[];
    matchedKeys?: NzTreeNode[];
    nodes?: NzTreeNode[];
    keys?: string[];
}
interface NzFormatBeforeDropEvent {
    dragNode: NzTreeNode;
    node: NzTreeNode;
    pos: number;
}
interface NzTreeNodeBaseComponent {
    markForCheck(): void;
}

declare class NzTreeBaseService {
    DRAG_SIDE_RANGE: number;
    DRAG_MIN_GAP: number;
    isCheckStrictly: boolean;
    isMultiple: boolean;
    selectedNode: NzTreeNode;
    rootNodes: NzTreeNode[];
    flattenNodes$: BehaviorSubject<NzTreeNode[]>;
    selectedNodeList: NzTreeNode[];
    expandedNodeList: NzTreeNode[];
    checkedNodeList: NzTreeNode[];
    halfCheckedNodeList: NzTreeNode[];
    matchedNodeList: NzTreeNode[];
    /**
     * handle to post process a tree node when it's instantiating, note that its children haven't been initiated yet
     */
    treeNodePostProcessor?: (node: NzTreeNode) => void;
    /**
     * reset tree nodes will clear default node list
     */
    initTree(nzNodes: NzTreeNode[]): void;
    flattenTreeData(nzNodes: NzTreeNode[], expandedKeys?: NzTreeNodeKey[] | true): void;
    getSelectedNode(): NzTreeNode | null;
    /**
     * get some list
     */
    getSelectedNodeList(): NzTreeNode[];
    /**
     * get checked node keys
     */
    getCheckedNodeKeys(): NzTreeNodeKey[];
    /**
     * return checked nodes
     */
    getCheckedNodeList(): NzTreeNode[];
    getHalfCheckedNodeList(): NzTreeNode[];
    /**
     * return expanded nodes
     */
    getExpandedNodeList(): NzTreeNode[];
    /**
     * return search matched nodes
     */
    getMatchedNodeList(): NzTreeNode[];
    isArrayOfNzTreeNode(value: NzSafeAny[]): boolean;
    /**
     * set drag node
     */
    setSelectedNode(node: NzTreeNode): void;
    /**
     * set node selected status
     */
    setNodeActive(node: NzTreeNode): void;
    /**
     * add or remove node to selectedNodeList
     */
    setSelectedNodeList(node: NzTreeNode, isMultiple?: boolean): void;
    /**
     * merge checked nodes
     */
    setHalfCheckedNodeList(node: NzTreeNode): void;
    setCheckedNodeList(node: NzTreeNode): void;
    /**
     * conduct checked/selected/expanded keys
     */
    conductNodeState(type?: string): NzTreeNode[];
    /**
     * set expanded nodes
     */
    setExpandedNodeList(node: NzTreeNode): void;
    setMatchedNodeList(node: NzTreeNode): void;
    /**
     * check state
     *
     * @param isCheckStrictly
     */
    refreshCheckState(isCheckStrictly?: boolean): void;
    conduct(node: NzTreeNode, isCheckStrictly?: boolean): void;
    /**
     * 1、children half checked
     * 2、children all checked, parent checked
     * 3、no children checked
     */
    conductUp(node: NzTreeNode): void;
    /**
     * reset child check state
     */
    conductDown(node: NzTreeNode, value: boolean): void;
    /**
     * flush after delete node
     */
    afterRemove(nodes: NzTreeNode[]): void;
    /**
     * drag event
     */
    refreshDragNode(node: NzTreeNode): void;
    resetNodeLevel(node: NzTreeNode): void;
    calcDropPosition(event: DragEvent): number;
    /**
     * drop
     * 0: inner -1: pre 1: next
     */
    dropAndApply(targetNode: NzTreeNode, dragPos?: number): void;
    /**
     * emit Structure
     * eventName
     * node
     * event: MouseEvent / DragEvent
     * dragNode
     */
    formatEvent(eventName: string, node: NzTreeNode | null, event: MouseEvent | DragEvent | null): NzFormatEmitEvent;
    /**
     * New functions for flatten nodes
     */
    getIndexOfArray(list: NzTreeNode[], key: string): number;
    /**
     * Render by nzCheckedKeys
     * When keys equals null, just render with checkStrictly
     *
     * @param keys
     * @param checkStrictly
     */
    conductCheck(keys: NzTreeNodeKey[] | null, checkStrictly: boolean): void;
    conductExpandedKeys(keys?: NzTreeNodeKey[] | true): void;
    conductSelectedKeys(keys: NzTreeNodeKey[], isMulti: boolean): void;
    /**
     * Expand parent nodes by child node
     *
     * @param node
     */
    expandNodeAllParentBySearch(node: NzTreeNode): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<NzTreeBaseService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<NzTreeBaseService>;
}

/**
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
 */

type NzTreeNodeKey = string | number;
interface FlattenNode {
    parent: FlattenNode | null;
    children: FlattenNode[];
    pos: string;
    data: NzTreeNode;
    isStart: boolean[];
    isEnd: boolean[];
}
interface NzTreeNodeOptions {
    title: string;
    key: string;
    icon?: string;
    isLeaf?: boolean;
    checked?: boolean;
    selected?: boolean;
    selectable?: boolean;
    disabled?: boolean;
    disableCheckbox?: boolean;
    expanded?: boolean;
    children?: NzTreeNodeOptions[];
    [key: string]: NzSafeAny;
}
declare class NzTreeNode {
    private _title;
    key: string;
    level: number;
    origin: NzTreeNodeOptions;
    parentNode: NzTreeNode | null;
    private _icon;
    private _children;
    private _isLeaf;
    private _isChecked;
    private _isSelectable;
    private _isDisabled;
    private _isDisableCheckbox;
    private _isExpanded;
    private _isHalfChecked;
    private _isSelected;
    private _isLoading;
    canHide: boolean;
    isMatched: boolean;
    service: NzTreeBaseService | null;
    component: NzTreeNodeBaseComponent;
    /** New added in Tree for easy data access */
    isStart?: boolean[];
    isEnd?: boolean[];
    get treeService(): NzTreeBaseService | null;
    /**
     * Init nzTreeNode
     *
     * @param option option user's input
     * @param parent parent node
     * @param service base nzTreeService
     */
    constructor(option: NzTreeNodeOptions | NzTreeNode, parent?: NzTreeNode | null, service?: NzTreeBaseService | null);
    /**
     * auto generate
     * get
     * set
     */
    get title(): string;
    set title(value: string);
    get icon(): string;
    set icon(value: string);
    get children(): NzTreeNode[];
    set children(value: NzTreeNode[]);
    get isLeaf(): boolean;
    set isLeaf(value: boolean);
    get isChecked(): boolean;
    set isChecked(value: boolean);
    get isHalfChecked(): boolean;
    set isHalfChecked(value: boolean);
    get isSelectable(): boolean;
    set isSelectable(value: boolean);
    get isDisabled(): boolean;
    set isDisabled(value: boolean);
    get isDisableCheckbox(): boolean;
    set isDisableCheckbox(value: boolean);
    get isExpanded(): boolean;
    set isExpanded(value: boolean);
    get isSelected(): boolean;
    set isSelected(value: boolean);
    get isLoading(): boolean;
    set isLoading(value: boolean);
    setSyncChecked(checked?: boolean, halfChecked?: boolean): void;
    setChecked(checked?: boolean, halfChecked?: boolean): void;
    setExpanded(value: boolean): void;
    getParentNode(): NzTreeNode | null;
    getChildren(): NzTreeNode[];
    /**
     * Support appending child nodes by position. Leaf node cannot be appended.
     */
    addChildren(children: NzSafeAny[], childPos?: number): void;
    clearChildren(): void;
    remove(): void;
    afterValueChange(key: string): void;
    update(): void;
}

/**
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
 */

declare const NzTreeHigherOrderServiceToken: InjectionToken<NzTreeBaseService>;

/**
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
 */

declare class NzTreeBase {
    nzTreeService: NzTreeBaseService;
    constructor(nzTreeService: NzTreeBaseService);
    /**
     * Coerces a value({@link any[]}) to a TreeNodes({@link NzTreeNode[]})
     */
    coerceTreeNodes(value: NzSafeAny[]): NzTreeNode[];
    /**
     * Get all nodes({@link NzTreeNode})
     */
    getTreeNodes(): NzTreeNode[];
    /**
     * Get {@link NzTreeNode} with key
     */
    getTreeNodeByKey(key: string): NzTreeNode | null;
    /**
     * Get checked nodes(merged)
     */
    getCheckedNodeList(): NzTreeNode[];
    /**
     * Get selected nodes
     */
    getSelectedNodeList(): NzTreeNode[];
    /**
     * Get half checked nodes
     */
    getHalfCheckedNodeList(): NzTreeNode[];
    /**
     * Get expanded nodes
     */
    getExpandedNodeList(): NzTreeNode[];
    /**
     * Get matched nodes(if nzSearchValue is not null)
     */
    getMatchedNodeList(): NzTreeNode[];
}

/**
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
 */

declare function isCheckDisabled(node: NzTreeNode): boolean;
declare function isInArray(needle: NzSafeAny, haystack: NzSafeAny[]): boolean;
declare function getPosition(level: string | number, index: number): string;
declare function getKey(key: NzTreeNodeKey, pos: string): NzTreeNodeKey;
/**
 * Flat nest tree data into flatten list. This is used for virtual list render.
 *
 * @param treeNodeList Origin data node list
 * @param expandedKeys
 * need expanded keys, provides `true` means all expanded (used in `rc-tree-select`).
 */
declare function flattenTreeData(treeNodeList?: NzTreeNode[], expandedKeys?: NzTreeNodeKey[] | true): FlattenNode[];

export { NzTreeBase, NzTreeBaseService, NzTreeHigherOrderServiceToken, NzTreeNode, flattenTreeData, getKey, getPosition, isCheckDisabled, isInArray };
export type { FlattenNode, NzFormatBeforeDropEvent, NzFormatEmitEvent, NzTreeNodeBaseComponent, NzTreeNodeKey, NzTreeNodeOptions };
