import {
  FilterDescriptor as KendoFilterDescriptor,
  SortDescriptor as KendoSortDescriptor,
} from "@progress/kendo-data-query";
import {
  FilterRowProps as KendoFilterRowProps,
  SortSettings as KendoSortSettings,
} from "@progress/kendo-react-data-tools";

import {
  TreeListColumnProps as KendoTreeListColumnProps,
  TreeListRowProps as KendoTreeListRowProps,
  TreeListNoRecordsProps as KendoTreeListNoRecordsProps,
  TreeListSelectableSettings as KendoTreeListSelectableSettings,
  TreeListToolbarProps as KendoTreeListToolbarProps,
  TreeListCellProps as KendoTreeListCellProps,
  TreeListHeaderCellProps as KendoTreeListHeaderCellProps,
  TreeListColumnMenuFilterChangeEvent as KendoTreeListColumnMenuFilterChangeEvent,
  TreeListColumnReorderEvent as KendoTreeListColumnReorderEvent,
  TreeListColumnResizeEvent as KendoTreeListColumnResizeEvent,
  TreeListDataStateChangeEvent as KendoTreeListDataStateChangeEvent,
  TreeListExpandChangeEvent as KendoTreeListExpandChangeEvent,
  TreeListFilterChangeEvent as KendoTreeListFilterChangeEvent,
  TreeListHeaderSelectionChangeEvent as KendoTreeListHeaderSelectionChangeEvent,
  TreeListItemChangeEvent as KendoTreeListItemChangeEvent,
  TreeListKeyDownEvent as KendoTreeListKeyDownEvent,
  TreeListPageChangeEvent as KendoTreeListPageChangeEvent,
  TreeListRowClickEvent as KendoTreeListRowClickEvent,
  TreeListRowContextMenuEvent as KendoTreeListRowContextMenuEvent,
  TreeListRowDoubleClickEvent as KendoTreeListRowDoubleClickEvent,
  TreeListRowDragEvent as KendoTreeListRowDragEvent,
  TreeListSelectionChangeEvent as KendoTreeListSelectionChangeEvent,
  TreeListSortChangeEvent as KendoTreeListSortChangeEvent,
} from "@progress/kendo-react-treelist";
import { CompositeFilterDescriptor } from "../DataTools/Filter/FilterProps";

export declare type ScrollMode = "none" | "scrollable" | "virtual";

export interface TreeListProps {
  dataTestId?: string;
  className?: string;
  columnMenu?: React.ComponentType<any>;
  columnMenuFilter?: CompositeFilterDescriptor[];
  columns?: KendoTreeListColumnProps[];
  columnVirtualization?: boolean;
  data?: any[];
  dataItemKey?: string;
  editField?: string;
  editRow?: React.ComponentType<KendoTreeListRowProps>;
  expandField?: string;
  filter?: KendoFilterDescriptor[];
  filterRow?: React.ComponentType<KendoFilterRowProps>;
  navigatable?: boolean;
  noRecords?: React.ReactElement<KendoTreeListNoRecordsProps>;
  pager?: React.ComponentType<any>;
  reorderable?: boolean;
  resizable?: boolean;
  row?: React.ComponentType<KendoTreeListRowProps>;
  rowDraggable?: boolean;
  rowHeight?: number;
  scrollable?: ScrollMode;
  selectable?: KendoTreeListSelectableSettings;
  selectedField?: string;
  skip?: number;
  sort?: KendoSortDescriptor[];
  sortable?: KendoSortSettings;
  style?: React.CSSProperties;
  subItemsField?: string;
  tableProps?: React.DetailedHTMLProps<
    React.TableHTMLAttributes<HTMLTableElement>,
    HTMLTableElement
  >;

  take?: number;
  toolbar?: React.ReactElement<KendoTreeListToolbarProps>;
  cellRender?: (
    defaultRendering: null | React.ReactElement<HTMLTableCellElement>,
    props: KendoTreeListCellProps
  ) => null | React.ReactElement<HTMLTableCellElement>;
  headerCellRender?: (
    defaultRendering: React.ReactNode,
    props: KendoTreeListHeaderCellProps
  ) => React.ReactNode;
  onColumnMenuFilterChange?: (
    event: KendoTreeListColumnMenuFilterChangeEvent
  ) => void;
  onColumnReorder?: (event: KendoTreeListColumnReorderEvent) => void;
  onColumnResize?: (event: KendoTreeListColumnResizeEvent) => void;
  onDataStateChange?: (event: KendoTreeListDataStateChangeEvent) => void;
  onExpandChange?: (event: KendoTreeListExpandChangeEvent) => void;
  onFilterChange?: (event: KendoTreeListFilterChangeEvent) => void;
  onHeaderSelectionChange?: (
    event: KendoTreeListHeaderSelectionChangeEvent
  ) => void;
  onItemChange?: (event: KendoTreeListItemChangeEvent) => void;
  onKeyDown?: (event: KendoTreeListKeyDownEvent) => void;
  onPageChange?: (event: KendoTreeListPageChangeEvent) => void;
  onRowClick?: (event: KendoTreeListRowClickEvent) => void;
  onRowContextMenu?: (event: KendoTreeListRowContextMenuEvent) => void;
  onRowDoubleClick?: (event: KendoTreeListRowDoubleClickEvent) => void;
  onRowDrag?: (event: KendoTreeListRowDragEvent) => void;
  onRowDrop?: (event: KendoTreeListRowDragEvent) => void;
  onSelectionChange?: (event: KendoTreeListSelectionChangeEvent) => void;
  onSortChange?: (event: KendoTreeListSortChangeEvent) => void;
  rowRender?: (
    row: React.ReactElement<HTMLTableRowElement>,
    props: KendoTreeListRowProps
  ) => React.ReactNode;
}
