import { DataUnit } from '@sankhyalabs/core';
import { Filter, FilterProvider } from '@sankhyalabs/core/dist/dataunit/metadata/UnitMetadata';
import { EventEmitter } from '../../stencil-public-runtime';
import { SnkMessageBuilder } from '../../lib/message/SnkMessageBuilder';
import { SnkApplication } from '../snk-application/snk-application';
import { IPersonalizedFilter } from '../snk-personalized-filter/interfaces/IPersonalizedFilter';
import FilterItemType from './filter-item/filter-item-type.enum';
import { SnkFilterItemConfig } from './filter-item/snk-filter-item';
export declare class SnkFilterBar implements FilterProvider {
  private _elPersonalizedFilter;
  _element: HTMLElement;
  _application: SnkApplication;
  _updateSequence: Array<string>;
  _loadingPending: boolean;
  _configUpdated: boolean;
  _firstLoad: boolean;
  _pendingVariables: boolean;
  _isDefaultFilter: boolean;
  _customfiltersToBeUpdated: Array<SnkFilterItemConfig>;
  _resolveLoading: any;
  _calculateSortIndex: (item: SnkFilterItemConfig) => number;
  private hasValidValue;
  _filtersComparator: (a: SnkFilterItemConfig, b: SnkFilterItemConfig) => number;
  /**
   * @description Define se o componente deve usar o LockManager para controle de carregamento.
   */
  enableLockManagerLoadingComp?: boolean;
  /**
   * @description Loader customizado para carregar as configurações.
   * @param {string} configName - Nome da configuração.
   * @param {string} resourceId - ID do recurso.
   * @param {any} options - Opções adicionais.
   * @returns {Promise<Array<SnkFilterItemConfig>>} Retorna a configuração dos filtros.
   */
  customFilterBarConfig?: (configName: string, resourceId: string, options: any) => Promise<Array<SnkFilterItemConfig>>;
  /**
   * @description Recebe o DataUnit do ambiente. Se não for informado, procura pela referência
   * do SnkDataUnit. Necessário para se registrar como provedor de filtros.
   */
  dataUnit: DataUnit;
  /**
   * @description Título que será apresentado na barra de filtros.
   */
  title: string;
  /**
   * @description Eventualmente poderemos ter mais de uma barra de filtros. Essa propriedade
   * serve para separar a configuração de cada uma.
   */
  configName: string;
  /**
   * @description Identificador de recursos como configurações e acesso.
   */
  resourceID: string;
  /**
   * @description Modo de apresentação da barra de filtros.
   */
  mode: "regular" | "button" | "hidden";
  /**
   * @description Lista todos os filtros disponíveis ao usuário.
   */
  filterConfig: Array<SnkFilterItemConfig>;
  /**
   * @description Responsável por flexibilizar e padronizar o uso de mensagens nos blocos de construção.
  */
  messagesBuilder: SnkMessageBuilder;
  /**
   * @description Desabilita a apresentação da opção de filtros personalizados na filter bar (chip de filtros)
   * e no modal lateral de filtros (container de filtros personalizados).
  */
  disablePersonalizedFilter: boolean;
  /**
   * @description Chave da configuração legada da barra de filtros.
   */
  filterBarLegacyConfigName: string;
  /**
   * @description Define se a carga dos dados será feita assim que o componente for carregado.
   */
  autoLoad?: boolean;
  /**
   * @description Função chamada depois de aplicar os filtros.
   */
  afterApplyConfig?: () => void;
  /**
   * @description Configuração customizada dos filtros.
   * @param {Array<SnkFilterItemConfig>} config - Lista de configurações de filtros.
   */
  filterCustomConfig?: Array<SnkFilterItemConfig>;
  /**
   * @description Intercepta a configuração dos filtros antes de serem aplicadas.
   * @param {Array<SnkFilterItemConfig>} config - Lista de configurações de filtros.
   * @returns {Array<SnkFilterItemConfig>} Retorna a lista de configurações de filtros.
   */
  filterCustomConfigInterceptor?: (config: Array<SnkFilterItemConfig>) => Array<SnkFilterItemConfig>;
  /**
   * @description Evento emitido quando a configuração dos filtros é atualizada.
   * @param {SnkFilterItemConfig[]} configs - Lista de configurações de filtros atualizadas.
   * @event
   */
  configUpdated: EventEmitter<SnkFilterItemConfig[]>;
  allowDefault: boolean;
  scrollerLocked: boolean;
  showPersonalizedFilter: boolean;
  personalizedFilterId: string;
  isFilterModalOpen: boolean;
  observeFilterConfig(newValue: Array<SnkFilterItemConfig>, oldValue: Array<SnkFilterItemConfig>): void;
  private handleFilterConfigsChanged;
  /**
   * @description Faz o recarregamento da barra de filtros buscando o state no servidor.
   * @async
   * @return {Promise<void>} Retorna uma Promise que resolve quando o recarregamento for concluído.
   */
  reload(): Promise<void>;
  /**
   * @description Retorna um item de filtro pelo ID.
   * @async
   * @param {string} id - ID do item de filtro.
   * @returns {Promise<SnkFilterItemConfig | undefined>} O item de filtro correspondente ou undefined se não for encontrado.
   */
  getFilterItem(id: string): Promise<SnkFilterItemConfig | undefined>;
  /**
  * @description Atualiza um item do filtro.
  * @async
  * @param {SnkFilterItemConfig} newFilterItem - Item com as informações atualizadas, caso o item não seja encontrado no array, ele não será modificado.
  * @return {Promise<void>} Retorna uma Promise que resolve quando a atualização for concluída.
  */
  updateFilterItem(newFilterItem: SnkFilterItemConfig): Promise<void>;
  /**
  * @description Adiciona um item de filtro.
  * @async
  * @param {SnkFilterItemConfig} filterItem - Item a ser adicionado, caso o item já exista com o ID, ele não será adicionado novamente.
  * @return {Promise<void>} Retorna uma Promise que resolve quando o item for adicionado.
  */
  addFilterItem(filterItem: SnkFilterItemConfig): Promise<void>;
  /**
  * @description Remove um item de filtro.
  * @async
  * @param {string} filterID - ID do item a ser removido.
  * @returns {Promise<SnkFilterItemConfig|undefined>} Retorna o item de filtro removido, ou undefined caso não seja encontrado.
  */
  removeFilterItem(filterID: string): Promise<SnkFilterItemConfig | undefined>;
  componentDidLoad(): void;
  private processPendingFilter;
  private getPersonalizedFilterItem;
  private processAfterUpdateConfig;
  private doLoadData;
  /**
   * Conforme mecanismo de mensagens, é possível customizar as mensagens dos blocos de construção
   * através de um pequeno módulo na estrutura da aplicação:
   * - Criar um arquivo no seguinte caminho: /messages/appmessages.msg.js.
   * Para conhecer os detalhes do módulo, vide o arquivo neste projeto "/src/lib/message/resources/snk-filter-bar.msg.ts"
   */
  private getMessage;
  getFilters(): Promise<Filter[]>;
  getFilter(_dataUnit: string): Array<Filter>;
  private isActiveFilter;
  private registryFilterProvider;
  private itemFocused;
  private filterActiveFilter;
  private filterPersonalizedItems;
  private getPersonalizedFilterVariableItems;
  private getFilterItems;
  private calculateUpdateSequence;
  private normalizeItem;
  private updateFilter;
  private loadPermitions;
  private addFilterBarLegacyConfigName;
  private loadConfigFromStorage;
  private attachDataUnit;
  /**
  * Emitido quando acontece a alteração do estado do filtro.
  */
  filterChangeListener(evt: CustomEvent): void;
  /**
   * Escuta quando há um filtro do tipo pesquisa retorna um valor vazio.
   */
  emptySearchListener(_evt: CustomEvent): Promise<void>;
  /**
   * @description Abre o modal de filtros.
   * @async
  */
  showFilterModal(): Promise<void>;
  private showPersonalizedFilterItem;
  addPersonalizedFilter(isDefault?: boolean): void;
  editPersonalizedFilter(id: string, isDefault?: boolean): void;
  deletePersonalizedFilter(filter: IPersonalizedFilter, filterItemType: FilterItemType, configName: string, isDefault?: boolean): void;
  closeFilterModal(): void;
  applyFiltersFromModal(filters: SnkFilterItemConfig[]): void;
  handleHidePersonalizedFilter(reloadFilterBar: boolean): void;
  hidePersonalizedFilter(): void;
  componentWillLoad(): Promise<void>;
  componentDidRender(): void;
  render(): any;
}
