import { TableColumnCtx } from "../table-column/defaults.js";
import { DefaultRow, TableSortOrder } from "../table/defaults.js";
import { StoreFilter } from "./index.js";
import { TreeData } from "./tree.js";
import { Ref } from "vue";

//#region ../../packages/components/table/src/store/watcher.d.ts
declare function useWatcher<T extends DefaultRow>(): {
  assertRowKey: () => void;
  updateColumns: () => void;
  scheduleLayout: (needUpdateColumns?: boolean, immediate?: boolean) => void;
  isSelected: (row: T) => boolean;
  clearSelection: () => void;
  cleanSelection: () => void;
  getSelectionRows: () => T[];
  toggleRowSelection: (row: T, selected?: boolean, emitChange?: boolean, ignoreSelectable?: boolean) => void;
  _toggleAllSelection: () => void;
  toggleAllSelection: (() => void) | null;
  updateAllSelected: () => void;
  updateSelectionByChildren: (options?: {
    emitChange?: boolean;
    rowIndexMap?: Map<string, number>;
  }) => void;
  getRowIndeterminate: (row: T) => boolean;
  updateFilters: (column: TableColumnCtx<T>, values: string[]) => Record<string, string[]>;
  updateCurrentRow: (_currentRow: T) => void;
  updateSort: (column: TableColumnCtx<T> | null, prop: string | null, order: TableSortOrder | null) => void;
  execFilter: () => void;
  execSort: () => void;
  execQuery: (ignore?: {
    filter: boolean;
  } | undefined) => void;
  clearFilter: (columnKeys?: string[] | string) => void;
  clearSort: () => void;
  toggleRowExpansion: (row: T, expanded?: boolean) => void;
  setExpandRowKeysAdapter: (val: string[]) => void;
  setCurrentRowKey: (key: string) => void;
  toggleRowExpansionAdapter: (row: T, expanded?: boolean) => void;
  isRowExpanded: (row: T) => boolean;
  updateExpandRows: () => void;
  updateCurrentRowData: () => void;
  loadOrToggle: (row: T) => void;
  updateTreeData: (ifChangeExpandRowKeys?: boolean, ifExpandAll?: boolean) => void;
  updateKeyChildren: (key: string, data: T[]) => void;
  states: {
    _currentRowKey: Ref<string | null, string | null>;
    currentRow: Ref<T | null, T | null>;
    expandRowKeys: Ref<string[], string[]>;
    treeData: Ref<Record<string, TreeData>, Record<string, TreeData>>;
    indent: Ref<number, number>;
    lazy: Ref<boolean, boolean>;
    lazyTreeNodeMap: Ref<Record<string, T[]>, Record<string, T[]>>;
    lazyColumnIdentifier: Ref<string, string>;
    childrenColumnName: Ref<string, string>;
    checkStrictly: Ref<boolean, boolean>;
    expandRows: Ref<T[], T[]>;
    defaultExpandAll: Ref<boolean, boolean>;
    tableSize: Ref<any, any>;
    rowKey: Ref<string | null, string | null>;
    data: Ref<T[], T[]>;
    _data: Ref<T[], T[]>;
    isComplex: Ref<boolean, boolean>;
    _columns: Ref<TableColumnCtx<T>[], TableColumnCtx<T>[]>;
    originColumns: Ref<TableColumnCtx<T>[], TableColumnCtx<T>[]>;
    columns: Ref<TableColumnCtx<T>[], TableColumnCtx<T>[]>;
    fixedColumns: Ref<TableColumnCtx<T>[], TableColumnCtx<T>[]>;
    rightFixedColumns: Ref<TableColumnCtx<T>[], TableColumnCtx<T>[]>;
    leafColumns: Ref<TableColumnCtx<T>[], TableColumnCtx<T>[]>;
    fixedLeafColumns: Ref<TableColumnCtx<T>[], TableColumnCtx<T>[]>;
    rightFixedLeafColumns: Ref<TableColumnCtx<T>[], TableColumnCtx<T>[]>;
    updateOrderFns: (() => void)[];
    leafColumnsLength: Ref<number, number>;
    fixedLeafColumnsLength: Ref<number, number>;
    rightFixedLeafColumnsLength: Ref<number, number>;
    isAllSelected: Ref<boolean, boolean>;
    selection: Ref<T[], T[]>;
    selectionIndeterminate: Ref<Record<string, boolean>, Record<string, boolean>>;
    reserveSelection: Ref<boolean, boolean>;
    selectOnIndeterminate: Ref<boolean, boolean>;
    selectable: Ref<((row: T, index: number) => boolean) | null, ((row: T, index: number) => boolean) | null>;
    rowExpandable: Ref<((row: T, index: number) => boolean) | null, ((row: T, index: number) => boolean) | null>;
    filters: Ref<StoreFilter, StoreFilter>;
    filteredData: Ref<T[] | null, T[] | null>;
    sortingColumn: Ref<TableColumnCtx<T> | null, TableColumnCtx<T> | null>;
    sortProp: Ref<string | null, string | null>;
    sortOrder: Ref<string | number | null, string | number | null>;
    hoverRow: Ref<T | null, T | null>;
  };
};
//#endregion
export { useWatcher as default };