import { Control, FieldValues, Path } from 'react-hook-form';
import { SelectProps as MuiSelectProps } from '@mui/material';
import { ReactNode } from 'react';
/**
 * Tipo para opções do select (reutilizado do FormSelect)
 */
export interface SelectOption<T = any> {
    /** Texto exibido na opção */
    label: string;
    /** Valor da opção (pode ser string, number, enum, etc.) */
    value: T;
    /** Se a opção está desabilitada */
    disabled?: boolean;
}
/**
 * Props do componente FormMultiSelect
 *
 * @template TFieldValues - Tipo do formulário (inferido do schema Zod)
 */
export interface FormMultiSelectProps<TFieldValues extends FieldValues> extends Omit<MuiSelectProps<any[]>, 'name' | 'value' | 'defaultValue' | 'onChange' | 'error' | 'multiple' | 'variant'> {
    /**
     * Instância do control do React Hook Form
     */
    control: Control<TFieldValues>;
    /**
     * Nome do campo no formulário (tipado com Path para autocomplete)
     */
    name: Path<TFieldValues>;
    /**
     * Label do campo
     */
    label: string;
    /**
     * Array de opções do select
     */
    options: SelectOption[];
    /**
     * Texto exibido quando nenhum valor está selecionado
     */
    placeholder?: string;
    /**
     * Texto de ajuda exibido abaixo do select (não sobrescreve erros)
     */
    helperText?: string;
    /**
     * Marca o campo como obrigatório visualmente (asterisco no label)
     */
    required?: boolean;
    /**
     * Ocupar largura total do container
     * @default true
     */
    fullWidth?: boolean;
    /**
     * Função para customizar a renderização dos valores selecionados
     * Recebe um array de valores selecionados
     */
    renderValue?: (selected: any[]) => ReactNode;
    /**
     * Variante visual dos chips exibidos
     * @default 'filled'
     */
    chipVariant?: 'filled' | 'outlined';
    /**
     * Máximo de chips a exibir antes de mostrar "+X mais"
     * Se não definido, exibe todos os chips
     */
    maxChipsDisplay?: number;
    /**
     * Controla se o menu está aberto (modo controlado).
     * Quando definido, o menu abre/fecha conforme este valor.
     */
    open?: boolean;
    /**
     * Chamado quando o menu do select é fechado (para uso com open controlado).
     */
    onClose?: () => void;
    /**
     * Chamado quando o menu do select é aberto (para uso com open controlado).
     */
    onOpen?: () => void;
}
