import { Control, FieldValues, Path } from 'react-hook-form';
import { TextFieldProps as MuiTextFieldProps } from '@mui/material';
import { ReactNode } from 'react';
/**
 * Props do componente FormInput
 *
 * @template TFieldValues - Tipo do formulário (inferido do schema Zod)
 */
export interface FormInputProps<TFieldValues extends FieldValues> extends Omit<MuiTextFieldProps, 'name' | 'value' | 'onChange' | 'error' | 'variant'> {
    /**
     * Propagated to the underlying <input> as data-testid for Playwright/Testing Library.
     */
    testId?: string;
    /**
     * 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;
    /**
     * Tipo do input (text, number, email, password, etc.)
     * @default 'text'
     */
    type?: 'text' | 'number' | 'email' | 'password' | 'tel' | 'url' | 'search';
    /**
     * Texto exibido quando o campo está vazio
     */
    placeholder?: string;
    /**
     * Texto de ajuda exibido abaixo do input (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;
    /**
     * Ícone exibido no início do input (posição start).
     * Exemplo: <Search /> do @mui/icons-material
     */
    startIcon?: ReactNode;
    /**
     * Ícone exibido no final do input (posição end).
     * Quando informado, tem prioridade sobre o clearable.
     */
    endIcon?: ReactNode;
    /**
     * Callback ao clicar no endIcon.
     */
    onEndIconClick?: () => void;
    /**
     * Quando true, exibe um botão de limpar (X) no final do input.
     * Em estado de erro, o ícone X é substituído por um ícone de erro.
     * Clicar no botão limpa o valor do campo via React Hook Form.
     * Ignorado se endIcon estiver presente.
     * @default false
     */
    clearable?: boolean;
    /**
     * Quando true, suprime a exibição visual do erro (borda vermelha e helper text),
     * mas a validação do React Hook Form continua bloqueando o submit normalmente.
     * @default false
     */
    hideError?: boolean;
    /**
     * Quando true, o input cresce linha a linha conforme o usuário digita.
     * Enter submete; Shift+Enter adiciona uma nova linha.
     * @default false
     */
    multiline?: boolean;
    /**
     * Número mínimo de linhas visíveis quando multiline=true.
     * @default 1
     */
    minRows?: number;
}
