import { ElementRef } from '@angular/core';
import { ControlValueAccessor } from '@angular/forms';
import * as i0 from "@angular/core";
/**
 * Representa um item de sugestão encapsulado, utilizado em componentes de autocomplete.
 * @template T Tipo dos dados associados à sugestão.
 * @property data Os dados da sugestão.
 * @property id Identificador único da sugestão.
 * @property [isSelected] Indica se a sugestão está selecionada.
 */
interface SuggestionWrapper<T> {
    data: T;
    id: string;
    isSelected?: boolean;
}
/**
 * @description Componente de autocompletar com sugestões dinâmicas, suportando seleção simples
 * e múltipla. Implementa {@link ControlValueAccessor} para integração com formulários Angular.
 * Oferece carregamento lazy de sugestões via output `lazyLoad`, virtualização de lista,
 * seleção com chips no modo múltiplo e acessibilidade ARIA completa (combobox role).
 *
 * @example
 * ```html
 * <s-autocomplete
 *   formControlName="cidade"
 *   placeholder="Buscar cidade..."
 *   [suggestions]="cidades"
 *   suggestionLabel="nome"
 *   [delay]="400"
 *   (completeMethod)="buscar($event)" />
 * ```
 *
 * @category Inputs
 */
export declare class AutocompleteComponent<T> implements ControlValueAccessor {
    private static nextId;
    /** @description Lista estática de sugestões exibidas no dropdown. No modo lazy, prefira usar o output `lazyLoad`. @default [] */
    suggestions: import("@angular/core").InputSignal<T[]>;
    /** @description Texto exibido no input quando nenhum valor está selecionado. */
    placeholder: import("@angular/core").InputSignal<string | undefined>;
    /** @description Chave do objeto de sugestão cujo valor será emitido ao formulário. */
    suggestionValue: import("@angular/core").InputSignal<keyof T | undefined>;
    /** @description Chave do objeto de sugestão usada como texto de exibição no dropdown. */
    suggestionLabel: import("@angular/core").InputSignal<keyof T | undefined>;
    /** @description Torna o campo somente leitura, impedindo digitação e seleção. @default false */
    readonly: import("@angular/core").InputSignal<boolean>;
    /** @description Mensagem exibida no dropdown quando nenhuma sugestão é encontrada. */
    emptyMessage: import("@angular/core").InputSignal<string | undefined>;
    /** @description Tempo de espera em ms após a última tecla antes de acionar a busca por sugestões. @default 300 */
    delay: import("@angular/core").InputSignal<number>;
    /** @description Exibe estado de erro visual no campo de input. @default false */
    invalid: import("@angular/core").InputSignal<boolean>;
    /** @description Habilita virtualização da lista de sugestões para melhor performance com grandes volumes de dados. @default false */
    virtualScroll: import("@angular/core").InputSignal<boolean>;
    /** @description Altura fixa em pixels de cada item no virtual scroll. @default 37 */
    virtualScrollItemSize: import("@angular/core").InputSignal<number>;
    /** @description Ativa o carregamento assíncrono de sugestões via o output `lazyLoad`. @default false */
    lazy: import("@angular/core").InputSignal<boolean>;
    /** @description Exibe um botão de dropdown para abrir a lista sem necessidade de digitação. @default false */
    dropdown: import("@angular/core").InputSignal<boolean>;
    /** @description Quando `true`, o valor do campo deve ser obrigatoriamente uma das opções sugeridas. @default false */
    forceSelection: import("@angular/core").InputSignal<boolean>;
    /** @description Exibe ícone de checkmark ao lado da opção selecionada no dropdown. @default false */
    checkmark: import("@angular/core").InputSignal<boolean>;
    /** @description Habilita seleção de múltiplos itens exibidos como chips no campo. @default false */
    multiple: import("@angular/core").InputSignal<boolean>;
    /** @description Quantidade mínima de caracteres necessária para acionar a busca por sugestões. @default 1 */
    minLengthToSearch: import("@angular/core").InputSignal<number>;
    /** @description Classe CSS adicional aplicada ao elemento `<input>` interno. @default '' */
    inputClass: import("@angular/core").InputSignal<string>;
    /** @description Chave do objeto usada para comparação de identidade entre opções, evitando duplicatas na seleção múltipla. */
    dataKey: import("@angular/core").InputSignal<keyof T | undefined>;
    /** @description Valor atualmente selecionado no modo simples, via two-way binding. */
    value: import("@angular/core").ModelSignal<T | null | undefined>;
    /** @description Lista de valores selecionados no modo múltiplo, via two-way binding. @default [] */
    values: import("@angular/core").ModelSignal<T[]>;
    /** @description Controla o estado desabilitado do componente via two-way binding. @default false */
    disabled: import("@angular/core").ModelSignal<boolean>;
    /**
     * @description Emitido no modo lazy quando o usuário digita e o componente está pronto para receber novas sugestões.
     * O evento contém `query` (texto digitado) e `response` (função callback para fornecer os dados).
     */
    lazyLoad: import("@angular/core").OutputEmitterRef<{
        query: string;
        response: (data: T[]) => void;
    }>;
    /** @description Emitido quando o usuário seleciona uma sugestão do dropdown. */
    selected: import("@angular/core").OutputEmitterRef<T>;
    /** @description Emitido quando o usuário remove uma sugestão selecionada (modo múltiplo). */
    unselected: import("@angular/core").OutputEmitterRef<T>;
    /** @description Emitido quando o campo perde o foco. */
    blurred: import("@angular/core").OutputEmitterRef<Event>;
    /** @description Emitido quando o campo é limpo pelo usuário. */
    cleared: import("@angular/core").OutputEmitterRef<void>;
    /** @description Emitido a cada pressionamento de tecla no campo de input. */
    keyUp: import("@angular/core").OutputEmitterRef<Event>;
    /** @description Emitido quando o campo recebe foco. */
    focused: import("@angular/core").OutputEmitterRef<any>;
    /** @description Emitido quando o usuário digita no campo, fornecendo o texto atual para filtragem de sugestões. */
    completeMethod: import("@angular/core").OutputEmitterRef<{
        query: string;
    }>;
    focusedIndex: import("@angular/core").WritableSignal<number>;
    isOpen: import("@angular/core").WritableSignal<boolean>;
    filteredSuggestions: import("@angular/core").WritableSignal<SuggestionWrapper<T>[]>;
    showEmptyMessage: import("@angular/core").WritableSignal<boolean>;
    filterText: import("@angular/core").WritableSignal<string>;
    inputValue: import("@angular/core").WritableSignal<string>;
    loading: import("@angular/core").WritableSignal<boolean>;
    componentId: string;
    inputEl: import("@angular/core").Signal<ElementRef<any> | undefined>;
    private _inputSubject$;
    private _lazyLoadSubject$;
    private _destroyRef;
    private _onChange?;
    private _onTouched?;
    /**
     * Computed que retorna uma lista de sugestões do tipo `SuggestionWrapper<T>`,
     * adicionando um identificador único a cada sugestão.
     * @returns Uma lista de sugestões processadas com identificadores únicos.
     */
    internalSuggestion: import("@angular/core").Signal<SuggestionWrapper<T>[]>;
    /**
     * Retorna um conjunto (`Set`) com os IDs das sugestões selecionadas.
     */
    selectedSuggestionIds: import("@angular/core").Signal<Set<string | undefined>>;
    /**
     * Retorna uma lista de sugestões filtradas, enriquecidas com a propriedade `isSelected`.
     * Cada sugestão recebe um campo booleano `isSelected` indicando se ela está selecionada,
     * com base nos IDs das sugestões selecionadas e no valor da sugestão.
     * @returns Uma lista de sugestões filtradas, cada uma com a propriedade adicional `isSelected`.
     */
    enrichedFilteredSuggestions: import("@angular/core").Signal<{
        isSelected: boolean;
        data: T;
        id: string;
    }[]>;
    constructor();
    /**
     * Define o valor do autocomplete.
     * @param value Valor a ser definido, único ou array, conforme seleção múltipla.
     * @throws Se múltiplo for falso e value for array.
     */
    writeValue(value: T | T[]): void;
    /**
     * Registra uma função de callback que será chamada sempre que o valor do componente mudar.
     * @param onChange Função a ser chamada quando o valor mudar. Recebe o novo valor como argumento, que pode ser um único valor ou um array de valores.
     */
    registerOnChange(onChange: (value: any | any[]) => void): void;
    /**
     * Registra uma função de callback que será chamada quando o componente for tocado (perder o foco).
     * @param onTouched Função de callback a ser chamada quando o componente for tocado.
     */
    registerOnTouched(onTouched: () => void): void;
    /**
     * Define o estado de desabilitado do componente.
     * @param disabled Indica se o componente deve ser desabilitado (`true`) ou habilitado (`false`).
     */
    setDisabledState?(disabled: boolean): void;
    /**
     * Manipula o evento de entrada do usuário no campo de texto do autocomplete.
     * Este método é chamado sempre que o usuário digita algo no campo de entrada.
     * Ele executa as seguintes ações:
     * - Dispara o callback de "touched" para controle de formulários.
     * - Obtém o valor atual do campo de entrada.
     * - Se o modo lazy estiver ativado, emite o evento de lazyLoad com a consulta e abre o painel de sugestões.
     * - Caso contrário, atualiza o texto de filtro, notifica os observadores e abre o painel de sugestões se houver sugestões disponíveis.
     * @param event Evento de entrada do tipo `Event` proveniente do campo de texto.
     */
    onInput(event: Event): void;
    /**
     * Manipula o evento de perda de foco (blur) do campo de entrada do autocomplete.
     * Este método verifica se o valor digitado pelo usuário corresponde exatamente a algum dos itens sugeridos.
     * - Se houver correspondência:
     *   - No modo múltiplo (`multiple`), adiciona o item selecionado à lista de valores, caso ainda não esteja presente.
     *   - No modo simples, seleciona o item correspondente se ainda não estiver selecionado.
     * - Se não houver correspondência, limpa o campo de entrada.
     */
    onInputBlur(event: Event): void;
    /**
     * Dispara o evento de foco quando o campo de entrada recebe foco.
     * @param event O evento de foco disparado pelo elemento de entrada.
     */
    onInputFocus(event: Event): void;
    /**
     * Manipula eventos de teclado no componente de autocomplete.
     * Este método gerencia a navegação e seleção de sugestões usando as teclas do teclado.
     * - 'ArrowDown': Move o foco para a próxima sugestão.
     * - 'ArrowUp': Move o foco para a sugestão anterior.
     * - 'Enter' ou 'Tab': Seleciona a sugestão atualmente focada e fecha a lista de sugestões.
     * - 'Escape': Fecha a lista de sugestões sem selecionar nenhum item.
     * @param event O evento de teclado disparado pelo usuário.
     */
    onKeyDown(event: KeyboardEvent): void;
    /**
     * Emite um evento quando uma tecla é liberada no componente.     *
     * @param event O evento de teclado associado à tecla liberada.
     */
    onKeyUp(event: Event): void;
    /**
     * Fecha o dropdown em eventos de redimensionamento de janela.
     */
    onWindowResize(): void;
    /**
     * Seleciona uma sugestão da lista de sugestões.
     * Se o modo múltiplo estiver ativado (`multiple()` retorna true), adiciona a sugestão à lista de suggestões selecionadas,
     * caso ela ainda não esteja presente. Em seguida, limpa o valor do campo de entrada.
     * Se o modo múltiplo não estiver ativado, define a sugestão como valor selecionado e atualiza o campo de entrada
     * com o rótulo correspondente.
     * Em ambos os casos, dispara o callback `_onChange` com o novo valor e fecha o painel de sugestões.
     * @param suggestion - A sugestão a ser selecionada.
     */
    selectSuggestion(suggestion: T): void;
    /**
     * Limpa o valor selecionado no componente de autocomplete.
     * Se o modo múltiplo estiver ativado, remove todos os valores selecionados.
     * Caso contrário, define o valor como nulo.
     * Também limpa as sugestões filtradas, fecha o painel de sugestões
     * e limpa o valor do campo de entrada.
     */
    clear(): void;
    /**
     * Alterna a exibição do dropdown de sugestões do autocomplete.
     * Este método configura o debounce do input, verifica se há sugestões filtradas
     * e, caso não haja sugestões e o texto do filtro esteja vazio, redefine as sugestões filtradas.
     * Por fim, alterna o estado de abertura do dropdown.
     */
    toggleDropdown(): void;
    /**
     * Função utilizada para otimizar a renderização de listas no Angular, permitindo que o framework
     * identifique cada item de forma única pelo seu `id`. Deve ser utilizada como função de `trackBy`
     * em diretivas como `*ngFor`.
     * @param _ - Índice do item na lista (não utilizado).
     * @param item - Objeto do tipo `SuggestionWrapper<T>` que representa o item atual.
     * @returns O identificador único (`id`) do item.
     */
    trackById(_: number, item: SuggestionWrapper<T>): string;
    /**
     * Remove uma sugestão da lista de valores selecionados.
     * @param suggestion O item a ser removido da lista de sugestões.
     */
    removeSuggestion(suggestion: T): void;
    /**
     * Reinicia a lista de sugestões filtradas.
     * Se o modo lazy estiver ativado, emite um evento para carregar sugestões com uma consulta vazia.
     * Em seguida, redefine as sugestões filtradas para o valor retornado por `internalSuggestion()`.
     * @private
     */
    private resetFilteredSuggestions;
    /**
     * Move o foco para a próxima sugestão na lista de sugestões, se houver.
     * @private
     * @param suggestions Lista de sugestões disponíveis.
     */
    private _focusNextSuggestion;
    /**
     * Move o foco para a sugestão anterior na lista de sugestões, se houver.
     * @private
     */
    private _focusPreviousSuggestion;
    /**
     * Rola a lista de sugestões para garantir que a sugestão atualmente focada esteja visível.
     * @private
     */
    private _scrollToFocusedSuggestion;
    /**
     * Adiciona um identificador único a cada sugestão fornecida.
     * @private
     * @param suggestions - Um array de sugestões do tipo T.
     * @returns Um array de objetos `SuggestionWrapper<T>`, cada um contendo a sugestão original e um identificador único.
     */
    private _addIdToSuggestions;
    /**
     * Configura o debounce e switchMap para lazy loading, resolvendo race conditions.
     * Este método utiliza switchMap para cancelar requisições anteriores automaticamente
     * quando uma nova busca é iniciada, evitando que resultados antigos sobrescrevam
     * resultados mais recentes.
     * @private
     */
    private _setupLazyLoadDebounce;
    /**
     * Configura o debounce para o input do autocomplete.
     * Este método utiliza um Subject para escutar as mudanças no valor do input,
     * aplicando um debounce com o tempo definido por `this.delay()`. Quando um novo valor é emitido:
     * - Se houver valor, filtra as sugestões com base no texto digitado e atualiza a lista de sugestões filtradas.
     * - Se não houver valor e o dropdown estiver ativo, reseta as sugestões filtradas.
     * - Caso contrário, limpa a lista de sugestões filtradas.
     * Também atualiza o estado da mensagem de lista vazia e, se a seleção for livre (`forceSelection` for falso),
     * propaga a mudança de valor para o formulário.
     * @private
     */
    private _setupInputDebounce;
    /**
     * Valida as entradas do componente de autocomplete.
     * @private
     * @throws {Error} Se as sugestões forem objetos e `suggestionLabel` não for fornecido.
     */
    private _validateInputs;
    static ɵfac: i0.ɵɵFactoryDeclaration<AutocompleteComponent<any>, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<AutocompleteComponent<any>, "s-autocomplete", never, { "suggestions": { "alias": "suggestions"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "suggestionValue": { "alias": "suggestionValue"; "required": false; "isSignal": true; }; "suggestionLabel": { "alias": "suggestionLabel"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "delay": { "alias": "delay"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "virtualScroll": { "alias": "virtualScroll"; "required": false; "isSignal": true; }; "virtualScrollItemSize": { "alias": "virtualScrollItemSize"; "required": false; "isSignal": true; }; "lazy": { "alias": "lazy"; "required": false; "isSignal": true; }; "dropdown": { "alias": "dropdown"; "required": false; "isSignal": true; }; "forceSelection": { "alias": "forceSelection"; "required": false; "isSignal": true; }; "checkmark": { "alias": "checkmark"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "minLengthToSearch": { "alias": "minLengthToSearch"; "required": false; "isSignal": true; }; "inputClass": { "alias": "inputClass"; "required": false; "isSignal": true; }; "dataKey": { "alias": "dataKey"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "values": { "alias": "values"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "values": "valuesChange"; "disabled": "disabledChange"; "lazyLoad": "lazyLoad"; "selected": "selected"; "unselected": "unselected"; "blurred": "blurred"; "cleared": "cleared"; "keyUp": "keyUp"; "focused": "focused"; "completeMethod": "completeMethod"; }, never, never, true, never>;
}
export {};
