import { Theme } from '@mui/material/styles';
import { Sizes } from '@m4l/styles';
import { M4LOverridesStyleRules } from '../../@types/augmentations';
import { CHECKABLE_LIST_KEY_COMPONENT } from './constants';
import { CheckableListSlots } from './slots/slots';
import { CheckableListRenderGroupParams } from './hooks/useCheckableListRender';
import { HexColor } from '@m4l/graphics';
/**
 * Item individual de la lista chequeable
 */
export interface CheckableListItem {
    /**
     * Identificador único del item
     */
    id: string | number;
    /**
     * Texto que se muestra
     */
    label: string;
    /**
     * Valor adicional del item (opcional, para casos donde id no es suficiente)
     */
    value?: any;
    /**
     * Si está deshabilitado
     */
    disabled?: boolean;
    /**
     * Texto adicional/descripción
     */
    description?: string;
    /**
     * Icono opcional
     */
    icon?: React.ReactNode;
    /**
     * Datos adicionales
     */
    metadata?: Record<string, any>;
    /**
     * Altura específica del item para virtualización
     */
    rowHeight?: number;
}
/**
 * Grupo de items chequeables
 */
export interface CheckableListGroup {
    /**
     * Identificador único del grupo
     */
    id: string | number;
    /**
     * Título del grupo
     */
    label: string;
    /**
     * Items del grupo
     */
    items: CheckableListItem[];
    /**
     * Si todo el grupo está deshabilitado
     */
    disabled?: boolean;
    /**
     * Estado inicial (expandido/colapsado)
     */
    collapsed?: boolean;
    /**
     * Descripción del grupo
     */
    description?: string;
    /**
     * Icono del grupo
     */
    icon?: React.ReactNode;
    /**
     * Datos adicionales del grupo
     */
    metadata?: Record<string, any>;
    /**
     * Color del grupo
     */
    color?: HexColor;
    /**
     * Si esta seleccionado el grupo o no
     */
    selected?: boolean;
}
/**
 * Tipo interno para items en la lista virtualizada
 */
export interface VirtualizedItem {
    type: 'item' | 'group';
    data: CheckableListItem | CheckableListGroup;
    index: number;
    groupIndex?: number;
}
/**
 * Propiedades del componente CheckableList
 */
export interface CheckableListRenderItemParams {
    /**
     * Item que se está renderizando
     */
    item: CheckableListItem;
    /**
     * Estado actual del checkbox
     */
    checked: boolean;
    /**
     * Índice del item dentro de la colección
     */
    index: number;
    /**
     * Si el item está deshabilitado (global o individual)
     */
    disabled: boolean;
    /**
     * Tamaño actual del componente
     */
    size: Extract<Sizes, 'small' | 'medium' | 'large'>;
    /**
     * Variante visual del componente
     */
    variant: 'standard' | 'outlined' | 'compact';
}
/**
 * Propiedades del componente CheckableList
 */
export interface CheckableListProps {
    /**
     * Array de IDs seleccionados (controlado)
     */
    value?: (string | number)[];
    /**
     * Callback cuando cambian las selecciones
     */
    onChange?: (selectedIds: (string | number)[]) => void;
    /**
     * Items cuando NO está agrupado
     */
    items?: CheckableListItem[];
    /**
     * Grupos cuando SÍ está agrupado
     */
    groups?: CheckableListGroup[];
    /**
     * Permitir selección múltiple (default: true)
     */
    multiple?: boolean;
    /**
     * Mostrar botón "Seleccionar todo" (default: false)
     */
    selectAll?: boolean;
    /**
     * Hacer los grupos expandibles/colapsables (default: true)
     */
    groupable?: boolean;
    /**
     * Expandir todos los grupos al inicio (default: true)
     */
    expandAllGroups?: boolean;
    /**
     * Mostrar barra de búsqueda
     */
    searchable?: boolean;
    /**
     * Función personalizada de filtrado
     */
    filterFn?: (item: CheckableListItem, query: string) => boolean;
    /**
     * Tamaño del componente
     */
    size?: Extract<Sizes, 'small' | 'medium'>;
    /**
     * Variante del componente
     */
    variant?: 'standard' | 'outlined' | 'compact';
    /**
     * Altura genérica para cada item (virtualización)
     */
    itemRowHeight?: number;
    /**
     * Altura genérica para cada encabezado de grupo
     */
    groupRowHeight?: number;
    /**
     * Ancho del componente (requerido para virtualización)
     */
    width?: number | string;
    /**
     * Tamaño de los checkboxes
     */
    checkboxSize?: 'small' | 'medium';
    /**
     * Checkbox en el grupo (seleccionar todo el grupo)
     */
    showCheckboxOnGroup?: boolean;
    /**
     * Comportamiento del checkbox indeterminado
     */
    indeterminateBehavior?: 'select-all' | 'indicate-some';
    /**
     * Clase CSS personalizada
     */
    className?: string;
    /**
     * ID para testing
     */
    'data-testid'?: string;
    /**
     * Label para accesibilidad
     */
    ariaLabel?: string;
    /**
     * ID del elemento que describe el componente
     */
    ariaLabelledBy?: string;
    /**
     * Render personalizado de item
     */
    renderItem?: (params: CheckableListRenderItemParams) => React.ReactNode;
    /**
     * Render personalizado de grupo
     */
    renderGroup?: (params: CheckableListRenderGroupParams) => React.ReactNode;
    /**
     * Estado de carga
     */
    loading?: boolean;
    /**
     * Deshabilitar toda la lista
     */
    disabled?: boolean;
}
/**
 * Estado del propietario del componente CheckableList
 */
export interface CheckableListOwnerState extends Record<string, unknown> {
    /**
     * Tamaño del componente
     */
    size?: Extract<Sizes, 'small' | 'medium'>;
    /**
     * Variante del componente
     */
    variant?: 'standard' | 'outlined' | 'compact';
    /**
     * Si está deshabilitado
     */
    disabled?: boolean;
    /**
     * Si está agrupado
     */
    grouped?: boolean;
    /**
     * Si tiene items seleccionados
     */
    hasSelected?: boolean;
    /**
     * Altura máxima del contenedor
     */
    maxHeight?: string | number;
    /**
     * Color del grupo
     */
    color?: HexColor;
}
/**
 * Tipo de slots del componente CheckableList
 */
export type CheckableListSlotsType = keyof typeof CheckableListSlots;
/**
 * Estilos del componente CheckableList
 */
export type CheckableListStyles = M4LOverridesStyleRules<CheckableListSlotsType, typeof CHECKABLE_LIST_KEY_COMPONENT, Theme>;
//# sourceMappingURL=types.d.ts.map