// Project: https://github.com/vueComponent/ant-design-vue
// Definitions by: akki-jat <https://github.com/akki-jat>
// Definitions: https://github.com/vueComponent/ant-design-vue/types

import { AntdComponent } from '../component';
import { Spin } from '../spin';
import { ScopedSlot, VNode } from 'vue/types/vnode';
import { Pagination } from '../pagination';
import { Column } from './column';
import { ColumnGroup } from './column-group';

export declare class PaginationConfig extends Pagination {
  position: 'top' | 'bottom' | 'both';
}

export interface customSelection {
  /**
   * Key
   * @description Unique key of this selection
   * @default undefined
   * @type string
   */
  key?: string;

  /**
   * Text
   * @description Display text of this selection
   * @default undefined
   * @type string | VNode
   */
  text?: string | VNode;

  /**
   * On Select
   * @description Callback executed when this selection is clicked
   * @default undefined
   * @type Function
   */
  onSelect?: (changeableRowKeys?: any) => any;
}

export interface TableRowSelection {
  /**
   * checkbox or radio
   * @default 'checkbox'
   * @type string
   */
  type?: 'checkbox' | 'radio';

  /**
   * Controlled selected row keys
   * @type string[]
   */
  selectedRowKeys?: string[];

  /**
   * Get Checkbox or Radio props
   * @type Function
   */
  getCheckboxProps?: (record: any) => any;

  /**
   * Custom selection config, only displays default selections when set to true
   * @type boolean | object[]
   */
  selections?: boolean | customSelection[];

  /**
   * Remove the default Select All and Select Invert selections
   * @default false
   * @type boolean
   */
  hideDefaultSelections?: boolean;

  /**
   * Fixed selection column on the left
   * @type boolean
   */
  fixed?: boolean;

  /**
   * Set the width of the selection column
   * @type string | number
   */
  columnWidth?: string | number;

  /**
   * Set the title of the selection column
   * @type string | VNode
   */
  columnTitle?: string | VNode;

  /**
   * Callback executed when selected rows change
   * @type Function
   */
  onChange?: (selectedRowKeys: Array<string | number>, selectedRows: object[]) => any;

  /**
   * Callback executed when select/deselect one row
   * @type Function
   */
  onSelect?: (record: any, selected: boolean, selectedRows: object[], nativeEvent: Event) => any;

  /**
   * Callback executed when select/deselect all rows
   * @type Function
   */
  onSelectAll?: (selected: boolean, selectedRows: object[], changeRows: object[]) => any;

  /**
   * Callback executed when row selection is inverted
   * @type Function
   */
  onSelectInvert?: (selectedRows: Object[]) => any;
}

export declare class Table extends AntdComponent {
  static Column: typeof Column;
  static ColumnGroup: typeof ColumnGroup;

  /**
   * Whether to show all table borders
   * @default false
   * @type  boolean
   */
  bordered: boolean;

  /**
   * The column contains children to display
   * @default 'children'
   * @type string | string[]
   */
  childrenColumnName: string | string[];

  /**
   * Columns of table
   * @type any
   */
  columns: any;

  /**
   * Override default table elements
   * @type object
   */
  components: object;

  /**
   * Data record array to be displayed
   * @type any
   */
  dataSource: any;

  /**
   * Expand all rows initially
   * @default false
   * @type boolean
   */
  defaultExpandAllRows: boolean;

  /**
   * Initial expanded row keys
   * @type string[]
   */
  defaultExpandedRowKeys: string[];

  /**
   * Current expanded row keys
   * @type string[]
   */
  expandedRowKeys: string[];

  /**
   * Expanded container render for each row
   * @type Function
   */
  expandedRowRender: (record: any, index: number, indent: number, expanded: boolean) => any;

  /**
   * Customize row expand Icon.
   * @type Function | ScopedSlot
   */
  expandIcon: Function | ScopedSlot;

  /**
   * Whether to expand row by clicking anywhere in the whole row
   * @default false
   * @type boolean
   */
  expandRowByClick: boolean;

  /**
   * Table footer renderer
   * @type Function | ScopedSlot
   */
  footer: Function | ScopedSlot;

  /**
   * Indent size in pixels of tree data
   * @default 15
   * @type number
   */
  indentSize: number;

  /**
   * Loading status of table
   * @default false
   * @type boolean | object
   */
  loading: boolean | Spin;

  /**
   * i18n text including filter, sort, empty text, etc
   * @default { filterConfirm: 'Ok', filterReset: 'Reset', emptyText: 'No Data' }
   * @type object
   */
  locale: object;

  /**
   * Pagination config or [Pagination] (/components/pagination/), hide it by setting it to false
   * @type boolean | PaginationConfig
   */
  pagination: boolean | PaginationConfig;

  /**
   * Row's className
   * @type Function
   */
  rowClassName: (record: any, index: number) => string;

  /**
   * Row's unique key, could be a string or function that returns a string
   * @default 'key'
   * @type string | Function
   */
  rowKey: string | Function;

  /**
   * Row selection config
   * @type object
   */
  rowSelection: TableRowSelection;

  /**
   * Set horizontal or vertical scrolling, can also be used to specify the width and height of the scroll area.
   * It is recommended to set a number for x, if you want to set it to true,
   * you need to add style .ant-table td { white-space: nowrap; }.
   * @type object
   */
  scroll: { x: number | true; y: number };

  /**
   * Whether to show table header
   * @default true
   * @type boolean
   */
  showHeader: boolean;

  /**
   * Size of table
   * @default 'default'
   * @type string
   */
  size: 'default' | 'middle' | 'small' | 'large';

  /**
   * Table title renderer
   * @type Function | ScopedSlot
   */
  title: Function | ScopedSlot;

  /**
   * Set props on per header row
   * @type Function
   */
  customHeaderRow: (
    column: any,
    index: number,
  ) => {
    props: object;
    attrs: object;
    on: object;
    class: object;
    style: object;
    nativeOn: object;
  };

  /**
   * Set props on per row
   * @type Function
   */
  customRow: (
    record: any,
    index: number,
  ) => {
    props: object;
    attrs: object;
    on: object;
    class: object;
    style: object;
    nativeOn: object;
  };
}