import { ReactNode } from 'react';
import { RowKey, RowHeightVariants, GridProps, OnChangeConfig } from '../../types';
import { Maybe } from '@m4l/core';
import { ActionsSlots, ColumnsConfigSlots, ControlNavigateSlots, DataGridSlots, RowsCountSlots, TableSlots, TextEditorSlots } from '../../slots/DataGridEnum';
import { SortColumn } from 'react-data-grid';
import { IGridConfig } from '../../helpers/persistence/getColumnsWidth/types';
import { BaseViewConfig } from '../../helpers/shared/getInitialColumnsConfig/types';
/**
 * Configuración extendida genérica con propiedades originales
 * USO INTERNO: El contexto usa esto para el estado interno con propiedades de tracking
 */
export type IViewConfig<TViewSpecific = object, TOriginalViewSpecific = object> = BaseViewConfig<TViewSpecific> & {
    hidden: boolean;
    originalIndex: number;
    originalVisible: boolean;
} & TOriginalViewSpecific;
/**
 * Configuración base para columnas de tabla
 * USO: Los desarrolladores pasan esto en defaultUserColumns.columnsConfig
 */
export interface BaseConfigColumn {
    key: string;
    visible: boolean;
    index: number;
    frozen: boolean;
    /**
     * Si la columna está agrupada actualmente.
     * Solo aplica para TreeDataGrid.
     */
    grouped?: boolean;
    /**
     * Orden en la jerarquía de agrupación (0 = primer nivel).
     * Solo aplica para TreeDataGrid.
     */
    groupOrder?: number;
    /**
     * @deprecated internamente el componente usa el name de columns.
     */
    name?: string;
}
/**
 * Configuración base para vista cards - omite frozen, grouped y groupOrder y agrega showTitle
 * USO: Los desarrolladores pasan esto en defaultUserColumns.columnsConfigCards
 */
export interface BaseConfigColumnCards extends Omit<BaseConfigColumn, 'frozen' | 'grouped' | 'groupOrder'> {
    showTitle: boolean;
}
/**
 * Configuración base para vista list - omite frozen, grouped y groupOrder y agrega showTitle.
 * USO: Los desarrolladores pasan esto en defaultUserColumns.columnsConfigList
 */
export interface BaseConfigColumnList extends Omit<BaseConfigColumn, 'frozen' | 'grouped' | 'groupOrder'> {
    showTitle: boolean;
}
/**
 * Configuración extendida para columnas de tabla (estado interno)
 * USO INTERNO: El contexto agrega estas propiedades para tracking y gestión de estado
 */
export interface IConfigColumn extends BaseConfigColumn {
    hidden: boolean;
    originalIndex: number;
    originalVisible: boolean;
    originalFrozen: boolean;
    /** Valor original de grouped definido en la columna */
    originalGrouped?: boolean;
    /** Valor original de groupOrder */
    originalGroupOrder?: number;
}
/**
 * Configuración extendida para cards (estado interno)
 * USO INTERNO: El contexto agrega estas propiedades para tracking y gestión de estado
 */
export interface IConfigColumnCards extends Omit<IConfigColumn, 'frozen' | 'originalFrozen' | 'grouped' | 'groupOrder' | 'originalGrouped' | 'originalGroupOrder'> {
    showTitle: boolean;
    originalShowTitle: boolean;
}
export type ViewMode = 'table' | 'cards' | 'list';
/**
 * Configuración extendida del Grid para soportar múltiples vistas
 * USO: Para nuevas implementaciones que soporten cards y futuras vistas
 * EXTENSIBILIDAD: Agregar aquí nuevas propiedades para nuevas vistas (ej: columnsConfigList)
 */
export interface IGridConfigExtended extends IGridConfig {
    /** Configuración de columnas para vista cards */
    columnsConfigCards?: BaseConfigColumnCards[];
    /** Configuración de columnas para vista list */
    columnsConfigList?: BaseConfigColumnList[];
    /** Modo de vista actual (table/cards/list) */
    viewMode?: ViewMode;
}
export interface DataGridProviderProps<TRow, TSummaryRow, TKey extends RowKey = RowKey> extends Pick<GridProps<TRow, TSummaryRow, TKey>, 'rows' | 'columns' | 'rowActionsGetter' | 'rowHeaderHeights' | 'rowHeights' | 'initialRowHeightVariant' | 'checkedRows' | 'onCheckedRowsChange' | 'checkedRowsMultiple' | 'rowKeyGetter' | 'externalSortSettings' | 'externalFilterSettings' | 'defaultViewMode' | 'cardsViewConfig' | 'listViewConfig' | 'reorderable'> {
    id: number | string;
    children: ReactNode;
    rowsCount: number;
    size: GridProps<any, any, any>['size'];
    viewMode?: ViewMode;
    onViewModeChange?: (viewMode: ViewMode) => void;
    /** Configuración inicial del DataGrid */
    defaultConfig?: IGridConfigExtended;
    /** Callback para persistir cambios de configuración */
    onChangeConfig?: OnChangeConfig;
    /**
     * @deprecated Usar `defaultConfig` en su lugar.
     */
    defaultUserColumns?: IGridConfigExtended;
    /**
     * @deprecated Usar `onChangeConfig` en su lugar.
     */
    onChangeUserColumns?: OnChangeConfig;
}
export type RowHeightState = {
    rowHVariant: RowHeightVariants;
    rowHeight: number;
    rowHeaderHeight: number;
};
export interface DataGridContextProps<TRow, TSummaryRow, TKey extends RowKey = RowKey> extends Pick<DataGridProviderProps<TRow, TSummaryRow, TKey>, 'rows' | 'checkedRows' | 'onCheckedRowsChange' | 'checkedRowsMultiple' | 'rowHeights' | 'rowsCount' | 'rowActionsGetter' | 'rowKeyGetter' | 'externalSortSettings' | 'externalFilterSettings' | 'viewMode' | 'onViewModeChange' | 'defaultViewMode' | 'cardsViewConfig' | 'listViewConfig'> {
    /** Callback para persistir cambios de configuración */
    onChangeConfig?: OnChangeConfig;
    /**
     * @deprecated Usar `onChangeConfig` en su lugar.
     */
    onChangeUserColumns?: OnChangeConfig;
    /** Whether column reordering is enabled */
    reorderable: boolean;
    getConfigColumns: (viewMode: ViewMode) => IViewConfig[];
    onChangeColumnsConfig: (viewMode: ViewMode, config: IViewConfig[]) => void;
    onChangeColumnsOrder: (viewMode: ViewMode, sourceKey: string, targetKey: string) => void;
    columnsConfig: IConfigColumn[];
    columnsWidths: Map<string, Maybe<string | number>>;
    setRowsCount: (newRowsCount: number) => void;
    currentRowHeaderHeight: number;
    currentRowHeight: number;
    currentRowHeightVariant: RowHeightVariants;
    setRowHeightVariant: (neVariant: RowHeightVariants) => void;
    onChangeColumnWidth: (columnKey: string, width: number) => void;
    classes?: Record<DataGridSlots | ActionsSlots | RowsCountSlots | TableSlots | TextEditorSlots | ColumnsConfigSlots | ControlNavigateSlots, string>;
    size: GridProps<any, any, any>['size'];
    sortColumns: SortColumn[];
    setSortColumns: React.Dispatch<React.SetStateAction<SortColumn[]>>;
}
//# sourceMappingURL=types.d.ts.map