import { ReactElement, ReactNode } from 'react';
import { Sizes, ComponentPalletColor } from '@m4l/styles';
import { PopoverProps } from '../../../../../extended/mui/Popover/types';
import { MenuItemProps } from '../../../../../extended/mui/MenuItem/types';
import { ComponentNameToClassKey, PaperProps, SxProps } from '@mui/material';
import { Theme } from '@mui/material/styles';
import { OverridesStyleRules } from '@mui/material/styles/overrides';
/**
 * Tipos de elementos que puede contener el menú.
 */
export type MenuTypes = 'menuItem' | 'divider' | 'loader' | 'customNode';
/**
 * Interfaz base para todas las acciones del menú.
 */
interface BaseMenuAction {
    type?: MenuTypes;
}
/**
 * Acción de tipo MenuItem con todas las propiedades disponibles.
 *
 * Hereda propiedades de MenuItemProps como startIcon, endIcon, label, etc.
 */
export interface MenuItemAction extends BaseMenuAction, Pick<MenuItemProps, 'startIcon' | 'endIcon' | 'label' | 'selected' | 'color' | 'disabled' | 'checkable' | 'checked'> {
    /** Tipo de acción (por defecto 'menuItem') */
    type?: 'menuItem';
    /** Callback ejecutado al hacer click en el item */
    onClick?: (arg?: any) => void;
    /** No aplica para este tipo de acción */
    customNode?: never;
    /** Indica si el item está en estado de error */
    error?: boolean;
    /** ID para pruebas automatizadas */
    dataTestId?: string;
}
/**
 * Acción de tipo divisor para separar grupos de items.
 */
interface DividerAction extends BaseMenuAction {
    type: 'divider';
    label?: never;
    onClick?: never;
    customNode?: never;
    error?: never;
}
/**
 * Acción de tipo nodo personalizado para renderizar contenido custom.
 */
interface CustomNodeAction extends BaseMenuAction {
    type: 'customNode';
    /** Nodo React personalizado a renderizar */
    customNode: ReactNode;
    label?: never;
    onClick?: never;
    error?: never;
}
/**
 * Unión de todos los tipos de acciones disponibles en el menú.
 * @example
 * ```tsx
 * const actions: MenuAction[] = [
 *   { type: 'menuItem', label: 'Editar', onClick: handleEdit },
 *   { type: 'divider' },
 *   { type: 'menuItem', label: 'Eliminar', onClick: handleDelete, error: true },
 * ];
 * ```
 */
export type MenuAction = MenuItemAction | DividerAction | CustomNodeAction;
/**
 * Props para el componente HeaderRenderClick.
 *
 * Extiende PopoverProps omitiendo 'open' y 'anchorEl' que se manejan internamente.
 */
export interface HeaderRenderClickProps extends Omit<PopoverProps, 'open' | 'anchorEl'> {
    /**
     * Tamaño del menú.
     * @default 'medium'
     */
    size?: Extract<Sizes, 'small' | 'medium'>;
    /**
     * Objeto con datos del item actual (fila).
     * Se pasa a menuActions si es función.
     */
    objItem?: any;
    /**
     * Acciones del menú.
     * Puede ser un array estático o una función que recibe el row y retorna acciones.
     */
    menuActions: MenuAction[] | ((row: any) => MenuAction[]);
    /**
     * Texto del tooltip.
     */
    toolTip?: string;
    /**
     * Elemento a renderizar al final de la lista del menú.
     */
    endListElement?: ReactElement;
    /**
     * Estilos personalizados para las acciones del menú.
     */
    menuActionSx?: SxProps<Theme> | Partial<OverridesStyleRules<string, ComponentNameToClassKey, Theme>>;
    /**
     * Contenido del Badge si está presente.
     */
    badgeContent?: string;
    /**
     * Elemento externo para controlar la apertura del menú.
     */
    externalOpen?: HTMLDivElement | null;
    /**
     * Función externa para cerrar el menú.
     */
    externalClose?: (element: null | HTMLDivElement) => void;
    /**
     * Indica si el menú está deshabilitado.
     */
    disabled?: boolean;
    /**
     * Componentes personalizados para cada slot interno.
     * @default {}
     */
    slots?: {
        root?: React.ElementType;
        paper?: React.ElementType;
    };
    /**
     * Props para el componente Paper del Popover.
     */
    paperProps?: PaperProps;
    /**
     * Indica si el menú tiene estado checked.
     */
    checked?: boolean;
    /**
     * Indica si el menú es checkable.
     */
    checkable?: boolean;
    /**
     * Nodo personalizado a agregar al menú.
     */
    customNode?: ReactNode;
    /**
     * Color del componente.
     */
    color?: Extract<ComponentPalletColor, 'primary'>;
    /**
     * Clave única para identificar la acción.
     */
    actionKey?: string;
    /**
     * Nodo a renderizar como header del menú.
     */
    header?: ReactNode;
    /**
     * Nodo a renderizar como footer del menú.
     */
    footer?: ReactNode;
    /**
     * Callback cuando el menú se abre o cierra.
     */
    onOpen?: (param: boolean) => void;
}
/**
 * Estado interno del componente HeaderRenderClick.
 */
export interface HeaderRenderClickOwnerState {
    /** Indica si el menú está seleccionado/abierto */
    selected: boolean;
}
export {};
//# sourceMappingURL=types.d.ts.map