import { Observable } from 'rxjs';
import { LookupSearchRequest } from '../../../components/lookup/models/lookup-api.model';
import { DynamicType, FieldConfig } from './field';
import { LookupGridFields } from '../../../components/lookup/types/lookup-models';
/**
 * Dados retornados pelo Observable de pesquisa avançada do Lookup.
 */
export interface SearchObservable {
    /** Array de registros retornados da pesquisa. */
    gridData: any[];
    /** Número total de registros encontrados (para paginação). */
    totalRecords: number;
    /** Label customizada para exibir o total de registros encontrados. */
    searchTotalRecordsLabel?: string;
}
/**
 * Configuração para campo de pesquisa avançada (Lookup).
 *
 * Exibe um input com autocompletar e botão de pesquisa que abre um diálogo com grid de resultados.
 * Suporta seleção simples ou múltipla, filtros padrão, ações CRUD na seleção e configuração
 * dinâmica das colunas da grade.
 *
 * Requer dois Observables:
 * - `suggestionsObservable`: para sugestões no autocompletar
 * - `searchObservable`: para a grade de resultados do diálogo
 */
export interface LookupFieldConfig extends FieldConfig {
    /** Tipo do campo: sempre `'lookup'`. */
    type: 'lookup';
    /**
     * Valor padrão pré-selecionado ao inicializar o formulário.
     */
    defaultValue?: any;
    /**
     * Quando `true`, permite selecionar múltiplos registros exibidos como tags.
     */
    multiple?: boolean;
    /**
     * Quando `true`, exibe o botão de pesquisa avançada que abre o diálogo com a grade.
     */
    showSearch?: boolean;
    /**
     * Colunas de filtro exibidas no diálogo de pesquisa avançada.
     * Cada item define o campo de filtro disponível para o usuário.
     */
    searchFields: DynamicType[];
    /**
     * Colunas exibidas na grade de resultados do diálogo de pesquisa.
     * Cada item define uma coluna com header e campo de dados.
     */
    searchGridFields: LookupGridFields[];
    /**
     * Observable que emite sugestões para o autocompletar do input do lookup.
     * Deve emitir um array de objetos com a propriedade `lookupDisplayField`.
     */
    suggestionsObservable: Observable<any[]>;
    /**
     * Observable que emite os dados da grade do diálogo de pesquisa avançada.
     * Deve emitir um objeto `SearchObservable` com `gridData` e `totalRecords`.
     *
     * Estrutura de `SearchObservable`: `{ gridData: any[]; totalRecords: number; searchTotalRecordsLabel?: string; }`
     * @typeImport import { SearchObservable } from '@seniorsistemas/angular-components/dynamic-form';
     */
    searchObservable: Observable<SearchObservable>;
    /**
     * Nome da propriedade única do objeto que identifica cada registro.
     * @example 'id'
     */
    dataKey: string;
    /**
     * Nome da propriedade do objeto de resultado a ser exibida no input e nas tags.
     * @example 'nome'
     */
    lookupDisplayField: string;
    /** Título do diálogo de pesquisa avançada. */
    searchTitle?: string;
    /** Mensagem exibida quando a pesquisa não retorna resultados. */
    searchEmptyTitle?: string;
    /** Label do campo de filtro no diálogo. */
    filterLabel?: string;
    /** Título do campo de filtro no diálogo. */
    filterTitle?: string;
    /** Label do botão de limpar filtros. */
    clearLabel?: string;
    /** Label do botão de cancelar e fechar o diálogo. */
    cancelLabel?: string;
    /** Label do botão de confirmar a seleção no diálogo. */
    selectLabel?: string;
    /** Mensagem exibida quando nenhum registro é encontrado na grade. */
    emptyMessage?: string;
    /** Label para um registro (singular). @example 'registro' */
    recordLabel?: string;
    /** Label para múltiplos registros (plural). @example 'registros' */
    recordsLabel?: string;
    /** Label exibida quando o campo está vazio e sem seleção. */
    emptyFieldLabel?: string;
    /**
     * Elemento DOM ao qual o painel de sugestões será anexado.
     * Use `'body'` para evitar problemas com `overflow: hidden`.
     */
    appendTo?: string;
    /**
     * Quando `true`, o usuário só pode selecionar valores da lista de sugestões;
     * texto livre é descartado ao perder o foco.
     */
    autocompleteForceSelection?: boolean;
    maxlength?: number | null;
    showAddOption?: boolean;
    /** Quando `true`, exibe o botão de editar o registro selecionado. */
    showEditOption?: boolean;
    /** Quando `true`, exibe o botão de remover registros selecionados. */
    showRemoveOption?: boolean;
    /**
     * Lista de colunas que não podem ser ordenadas na grade do diálogo.
     * @example ['descricao', 'createdAt']
     */
    sortableColumnsDisabled?: string[];
    /**
     * Filtros padrão aplicados automaticamente à pesquisa.
     * Cada item define um campo e um valor fixo ou dinâmico (função).
     *
     * Estrutura de `DefaultFilter`: `{ field: string; value: string | (() => string); }`
     * @typeImport import { DefaultFilter } from '@seniorsistemas/angular-components/dynamic-form';
     */
    defaultFilter?: DefaultFilter[];
    /**
     * Callback chamado quando o usuário digita para buscar sugestões.
     * Deve atualizar o `suggestionsObservable` com os resultados da busca.
     */
    onLookupRequest: (query: string) => void;
    /**
     * Callback chamado quando o usuário realiza uma pesquisa no diálogo avançado.
     * Deve atualizar o `searchObservable` com os resultados paginados.
     *
     * Estrutura de `LookupSearchRequest`: `{ filterData: Record<string, any>; first: number; rows: number; }`
     * @typeImport import { LookupSearchRequest } from '@seniorsistemas/angular-components/dynamic-form';
     */
    onSearchRequest: (event: LookupSearchRequest) => void;
    /** Callback chamado quando o usuário seleciona um registro. */
    onSelect?: (event: any) => void;
    /** Callback chamado quando o usuário remove um registro selecionado (modo múltiplo). */
    onUnselect?: (event: any) => void;
    /** Callback chamado quando o usuário limpa todos os registros selecionados. */
    onClear?: (event: any) => void;
    /** Callback chamado quando o campo perde o foco. */
    onBlur?: (event: FocusEvent) => void;
    /** Callback chamado quando o usuário clica no botão de adicionar novo registro. */
    onAdd?: () => void;
    /** Callback chamado quando o usuário clica no botão de editar. Recebe o item selecionado. */
    onEdit?: (selectedItem: unknown) => void;
    /** Callback chamado quando o usuário clica no botão de remover. Recebe os itens selecionados. */
    onRemove?: (selectedItems: unknown[]) => void;
    /** Callback chamado quando o usuário clica no botão de limpar do campo (X). */
    onClearButtonClick?: () => void;
}
export type DefaultFilter = {
    /** Nome do campo a ser filtrado. */
    field: string;
    /** Valor do filtro. Pode ser uma string estática ou função que retorna o valor dinamicamente. */
    value: string | (() => string);
};
declare module './field' {
    interface FieldTypeMap {
        lookup: LookupFieldConfig;
    }
}
