import { EventEmitter } from '../../stencil-public-runtime';
import { DataUnit, DataUnitAction, DUActionInterceptor, Record, SelectionInfo } from '@sankhyalabs/core';
import { SnkApplication } from '../snk-application/snk-application';
import { IFieldConfig } from '@sankhyalabs/ezui/dist/types/utils/form/interfaces';
import { SnkMessageBuilder } from '../../lib/message/SnkMessageBuilder';
import { IRecordID } from '../snk-data-exporter/interfaces/IRecordID';
export declare class SnkDataUnit implements DUActionInterceptor {
  _onDataUnitResolve: Array<(dataUnit: DataUnit) => void>;
  _application: SnkApplication;
  _permissions: any;
  _parentSnkDataUnit: HTMLSnkDataUnitElement;
  _parentDataUnit: DataUnit;
  _openedAlert: boolean;
  _fieldsWithRmp: string[];
  _fieldsWithRmPrecision: string[];
  _metadataByRow: Map<string, any>;
  _rowMetadataCache: Map<string, any>;
  _formFieldsConfig: IFieldConfig[];
  _internalDataStateChange: boolean;
  REGEX_DATAUNIT_NAME: RegExp;
  element: HTMLSnkDataUnitElement;
  fieldsToLink: Array<string>;
  /**
   * Controla o estado atual dos dados.
   * @type {DataState}
  */
  dataState: DataState;
  /**
   * Responsável por flexibilizar e padronizar o uso de mensagens nos blocos de construção.
   * @type {SnkMessageBuilder}
   */
  messagesBuilder: SnkMessageBuilder;
  /**
   * Usado para criar o dataUnit uma única vez.
   * Se omitido, será usado o próprio nome da entidade.
   * @type {string}
   */
  dataUnitName: string;
  /**
   * Determina qual a entidade que representa os dados em questão.
   * @type {string}
   */
  entityName: string;
  /**
   * Determina quantas linhas são retornadas por página.
   * @type {number}
   * @default 150
   */
  pageSize: number;
  /**
   * Uma vez instanciado, pode-se obter o dataUnit por esta propriedade.
   * @type {DataUnit}
   */
  dataUnit: DataUnit;
  /**
   * Executado imediatamente antes da ação de salvar as alterações. Útil no caso de validações por exemplo.
   * Caso retorne "false" (ou a promessa se resolva como false), cancela a ação.
   * @param {DataUnit} dataUnit - A instância do DataUnit.
   * @returns {boolean | Promise<boolean>} `false` para cancelar a ação, `true` para continuar.
   */
  beforeSave: (dataUnit: DataUnit) => boolean | Promise<boolean>;
  /**
   * Executado após a ação de salvar.
   * @param {DataUnit} dataUnit - A instância do DataUnit.
   * @returns {void}
   */
  afterSave: (dataUnit: DataUnit) => void;
  /**
   * Determina se será usado mensagem de confirmação padrão na tentativa de cancelar a edição.
   * @type {boolean}
   * @default true
  */
  useCancelConfirm: boolean;
  /**
   * Responsável por evitar a mensagem de sucesso ao salvar.
   * @type {boolean}
   */
  ignoreSaveMessage: boolean;
  /**
   * Usado para obter configuração de metadados.
   * @type {string}
   */
  configName: string;
  /**
   * Identificador de recursos como configurações e acesso.
   * @type {string}
   */
  resourceID: string;
  /**
  * Define a chave customizada para sobrescrever as mensagens (Não pegando pela entidade)
  * @type {string}
  */
  domainMessagesBuilder: string;
  observePageSize(): void;
  observeDataUnitName(newValue: string, oldValue: string): void;
  observeEntityName(newValue: string, oldValue: string): void;
  observeDataState(newValue: DataState, oldValue: DataState): void;
  observeDataUnit(): void;
  observeMessagesBuilder(newValue: SnkMessageBuilder): void;
  /**
   * Emitido quando há qualquer mudança de estado no DataUnit.
   * @event dataStateChange
   * @type {CustomEvent<DataState>}
   * @bubbles false
   */
  dataStateChange: EventEmitter<DataState>;
  /**
   * Emitido quando o DataUnit está pronto.
   * @event dataUnitReady
   * @type {CustomEvent<DataUnit>}
   * @bubbles false
   */
  dataUnitReady: EventEmitter<DataUnit>;
  /**
   * Emitido quando o messagesBuilder é atualizado.
   * @event messagesBuilderUpdated
   * @type {CustomEvent<SnkMessageBuilder>}
   * @bubbles false
   */
  messagesBuilderUpdated: EventEmitter<SnkMessageBuilder>;
  /**
   * Emitido quando há campos no DataUnit que devem ser ocultados.
   * @event dataUnitFieldsHidded
   * @type {CustomEvent<void>}
   */
  dataUnitFieldsHidded: EventEmitter<void>;
  /**
   * Emitido quando um registro é adicionado ou copiado.
   * @event insertionMode
   * @type {CustomEvent<void>}
   * @bubbles false
   */
  insertionMode: EventEmitter<void>;
  /**
   * Emitido quando se cancela uma inserção ou cópia.
   * @event cancelEdition
   * @type {CustomEvent<void>}
   * @bubbles false
   */
  cancelEdition: EventEmitter<void>;
  onMasterFormConfigChange({ detail }: CustomEvent): void;
  /**
   * Obtém o dataUnit.
   * @returns {Promise<DataUnit>} Uma promessa que resolve com a instância do DataUnit.
   * @async
   */
  getDataUnit(): Promise<DataUnit>;
  /**
   * Método que retorna a lista de IDs dos registros selecionados.
   * @returns {Promise<Array<IRecordID>>} Retorna uma promessa que resolve com a lista de IDs dos registros selecionados.
   * @async
   */
  getSelectedRecordsIDsInfo(): Promise<Array<IRecordID>>;
  /**
   * Retorna os campos que possuem a propriedade "rmp" (Row Metadata Provider).
   * @returns {Promise<string[]>} Uma promessa que resolve com um array de nomes de campos.
   * @async
   */
  getFieldsWithRmp(): Promise<string[]>;
  /**
   * Retorna os campos que possuem a propriedade "rm_precision" (Row Metadata Precision).
   * @returns {Promise<string[]>} Uma promessa que resolve com um array de nomes de campos.
   * @async
   */
  getFieldsWithRmPrecision(): Promise<string[]>;
  /**
   * Busca os metadados da linha selecionada.
   * @param {Record | string} [record] - O registro ou ID do registro para o qual buscar os metadados. Se omitido, usa o registro selecionado.
   * @returns {Promise<RowMetadata>} Uma promessa que resolve com os metadados da linha.
   * @async
   */
  getRowMetadata(record?: Record | string): Promise<RowMetadata>;
  private doGetRowMetadata;
  private buildGetPropRowMetadata;
  private resolvePrecisionFromMetadata;
  getCleanOnCopyFields(): Array<string>;
  private fillFieldsWithRmp;
  private fillFieldsWithRmPrecision;
  private getCacheName;
  private updateDataStateRmp;
  private saveCacheRmd;
  private getMetadataByRow;
  private interceptRecordsAdded;
  private interceptRecordsCopied;
  private interceptDataChange;
  private interceptSavingData;
  private confirmMultipleSavingData;
  private getChangingFields;
  private buildChangingField;
  private getFieldTabName;
  private interceptDataSaved;
  private interceptEditionCanceled;
  private interceptRemovingRecords;
  private interceptDataLoaded;
  private interceptMetadataLoaded;
  interceptAction(action: DataUnitAction): Promise<DataUnitAction>;
  private handleLoadRowMetadata;
  private updateRowMetadata;
  private handleDULinksOnMetadataLoaded;
  private handleRecordsCopied;
  private handleLinksWithParent;
  private buildRecordWithLinkedFields;
  private handleCleanOnCopy;
  private buildCopyWithCleanedFields;
  private showSuccessMessage;
  private isAllowed;
  private buildDataState;
  private handleDataSaved;
  private canIgnoreOperationMessage;
  private isCloneOrInsertOperation;
  private buildOperationMessage;
  private buildMultipleUpdateMessage;
  private isMultiplesUpdate;
  private handleRecordsRemoved;
  private buildRemoveFinishMessage;
  _dataUnitObserver: (action: DataUnitAction) => Promise<void>;
  /**
   * Conforme mecanismo de mensagens, é possível customizar as mensagens dos blocos de construção
   * através de um pequeno modulo 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-data-unit.msg.ts"
   */
  private getMessage;
  private getMessageParams;
  private getMessageOperation;
  private getDataUnitParentOrChild;
  private updateMetadataWithRMP;
  loadDataUnit(): Promise<void>;
  private getParentSnkDataUnit;
  private handlerLinkFields;
  private handleDUWithLinks;
  private processLinks;
  private getCleanDataUnitName;
  static getNearestInstance(element: HTMLElement): HTMLSnkDataUnitElement;
  private instanceMessagesBuilder;
  componentWillLoad(): void;
  disconnectedCallback(): void;
  componentDidLoad(): Promise<void>;
  render(): any;
}
export interface DataState {
  copyMode: boolean;
  insertionMode: boolean;
  isStartingInsertionMode: boolean;
  isDirty: boolean;
  hasDirtyRecords: boolean;
  hasNext: boolean;
  hasPrevious: boolean;
  selectionInfo?: SelectionInfo;
  selectedRecord: Record;
  recordsIsEmpty?: boolean;
  metadataByRow?: Map<string, any>;
  rowMetadata?: RowMetadata;
}
export interface RowMetadata {
  [key: string]: any;
  getProp: (propPath: string, fieldName?: string) => any;
}
export interface ChangingField {
  label: string;
  value: string;
  tabName?: string;
}
