import { ComponentType, ReactElement, ReactNode } from "react";

import {
  DataResult as KendoDataResult,
  CompositeFilterDescriptor as KendoCompositeFilterDescriptor,
  GroupDescriptor as KendoGroupDescriptor,
  SortDescriptor as KendoSortDescriptor,
} from "@progress/kendo-data-query";
import {
  PagerProps as KendoPagerProps,
  SortSettings as KendoSortSettings,
} from "@progress/kendo-react-data-tools";
import {
  GridCellsSettings as KendoGridCellsSettings,
  GridColumnMenuProps as KendoGridColumnMenuProps,
  GridDetailRowProps as KendoGridDetailRowProps,
  GridFilterOperators as KendoGridFilterOperators,
  GridGroupableSettings as KendoGridGroupableSettings,
  GridPagerSettings as KendoGridPagerSettings,
  GridSelectableSettings as KendoGridSelectableSettings,
  GridCellProps as KendoGridCellProps,
  GridFilterCellProps as KendoGridFilterCellProps,
  GridHeaderCellProps as KendoGridHeaderCellProps,
  GridColumnReorderEvent as KendoGridColumnReorderEvent,
  GridColumnResizeEvent as KendoGridColumnResizeEvent,
  GridContextMenuEvent as KendoGridContextMenuEvent,
  GridDataStateChangeEvent as KendoGridDataStateChangeEvent,
  GridExpandChangeEvent as KendoGridExpandChangeEvent,
  GridFilterChangeEvent as KendoGridFilterChangeEvent,
  GridGroupChangeEvent as KendoGridGroupChangeEvent,
  GridHeaderSelectionChangeEvent as KendoGridHeaderSelectionChangeEvent,
  GridItemChangeEvent as KendoGridItemChangeEvent,
  GridKeyDownEvent as KendoGridKeyDownEvent,
  GridNavigationActionEvent as KendoGridNavigationActionEvent,
  GridPageChangeEvent as KendoGridPageChangeEvent,
  GridRowClickEvent as KendoGridRowClickEvent,
  GridRowDoubleClickEvent as KendoGridRowDoubleClickEvent,
  GridEvent as KendoGridEvent,
  GridSelectionChangeEvent as KendoGridSelectionChangeEvent,
  GridSortChangeEvent as KendoGridSortChangeEvent,
  GridRowProps as KendoGridRowProps,
} from "@progress/kendo-react-grid";
import { ScrollMode as KendoScrollMode } from "@progress/kendo-react-grid/dist/npm/ScrollMode";

export interface GridProps {
  dataTestId?: string;
  ariaLabel?: string;
  cells?: KendoGridCellsSettings;
  children?: React.ReactNode;
  className?: string;
  columnMenu?: null | ComponentType<KendoGridColumnMenuProps>;
  columnVirtualization?: boolean;
  data?: null | any[] | KendoDataResult;
  dataItemKey?: string;
  detail?: null | ComponentType<KendoGridDetailRowProps>;
  detailRowHeight?: number;
  editField?: string;
  expandField?: string;
  filter?: KendoCompositeFilterDescriptor;
  filterable?: boolean;
  filterOperators?: KendoGridFilterOperators;
  fixedScroll?: boolean;
  group?: KendoGroupDescriptor[];
  groupable?: boolean | KendoGridGroupableSettings;
  id?: string;
  lockGroups?: boolean;
  navigatable?: boolean;
  pageable?: boolean | KendoGridPagerSettings;
  pager?: null | ComponentType<KendoPagerProps>;
  pageSize?: number;
  reorderable?: boolean;
  resizable?: boolean;
  rowHeight?: number;
  scrollable?: KendoScrollMode;
  selectable?: KendoGridSelectableSettings;
  selectedField?: string;
  size?: "small" | "medium";
  skip?: number;
  sort?: KendoSortDescriptor[];
  sortable?: KendoSortSettings;
  style?: React.CSSProperties;
  take?: number;
  total?: number;
  cellRender?: (
    defaultRendering: null | ReactElement<HTMLTableCellElement>,
    props: KendoGridCellProps
  ) =>
    | null
    | ReactElement<HTMLTableCellElement>
    | ReactElement<HTMLTableCellElement>[];
  filterCellRender?: (
    defaultRendering: null | ReactElement<any>,
    props: KendoGridFilterCellProps
  ) => null | ReactElement<any>;
  headerCellRender?: (
    defaultRendering: ReactNode,
    props: KendoGridHeaderCellProps
  ) => ReactNode;
  onColumnReorder?: (event: KendoGridColumnReorderEvent) => void;
  onColumnResize?: (event: KendoGridColumnResizeEvent) => void;
  onContextMenu?: (event: KendoGridContextMenuEvent) => void;
  onDataStateChange?: (event: KendoGridDataStateChangeEvent) => void;
  onExpandChange?: (event: KendoGridExpandChangeEvent) => void;
  onFilterChange?: (event: KendoGridFilterChangeEvent) => void;
  onGroupChange?: (event: KendoGridGroupChangeEvent) => void;
  onHeaderSelectionChange?: (
    event: KendoGridHeaderSelectionChangeEvent
  ) => void;
  onItemChange?: (event: KendoGridItemChangeEvent) => void;
  onKeyDown?: (event: KendoGridKeyDownEvent) => void;
  onNavigationAction?: (event: KendoGridNavigationActionEvent) => void;
  onPageChange?: (event: KendoGridPageChangeEvent) => void;
  onRowClick?: (event: KendoGridRowClickEvent) => void;
  onRowDoubleClick?: (event: KendoGridRowDoubleClickEvent) => void;
  onScroll?: (event: KendoGridEvent) => void;
  onSelectionChange?: (event: KendoGridSelectionChangeEvent) => void;
  onSortChange?: (event: KendoGridSortChangeEvent) => void;
  rowRender?: (
    row: ReactElement<HTMLTableRowElement>,
    props: KendoGridRowProps
  ) => ReactNode;
}
