import { GetLabelType } from '@m4l/core';
import { Sizes } from '@m4l/styles';
import { MutableRefObject } from 'react';
import { DynamicFilterProps, FilterField, FilterFieldApplied, FilterToEditApply, InitialFilterApplied, OwnerState } from '../types';
export type OpenFor = 'add' | 'edit';
export interface PopoverFilterDataBase {
    /**
     *  Motivo de apertura del popup
     */
    openFor: OpenFor;
}
export interface PopoverFilterDataAdd extends PopoverFilterDataBase {
    openFor: 'add';
    /**
     * Campo por el cual se va a filtrar
     */
    field: FilterField;
}
export interface PopoverFilterDataEdit extends PopoverFilterDataBase {
    openFor: 'edit';
    /**
     *  Filtro que se va a editar
     */
    filter: FilterFieldApplied;
    field: FilterField;
}
/**
 * Tipo usado para cuado se va agregar o modificar un filtro
 */
export type PopoverFilterData = PopoverFilterDataAdd | PopoverFilterDataEdit;
/**
 * Estados que se actulizan por fuera del store, a través de hooks
 */
export type ExternalOwnerState = Pick<OwnerState, 'isMobile' | 'isSkeleton'>;
/**
 * Interface que define el estado del componente
 */
export interface DynamicFilterState extends Pick<DynamicFilterProps, 'visibleRefresh' | 'size' | 'dataTestId' | 'automatic' | 'storeId' | 'withAllField' | 'fields'> {
    /**
     *  "ownerState" estado a nivel de clases del componente
     */
    ownerState: OwnerState;
    /**
     *  "allField" Campo que se usa cuando se puede buscar por todos los campos
     */
    allField: FilterField;
    /**
     *  "isOpenPopoverMenuFields" determina si se debe abrir el menú de campos
     */
    isOpenPopoverMenuFields?: boolean;
    /**
     *  "inputData" texto en el InputFilter
     */
    inputData: string;
    /**
     * Campos disponibles para filtrar
     */
    availableFields: Array<FilterField>;
    /**
     *  "applyedFilters" Filtros aplicados actualmente
     */
    appliedFilters: Array<FilterFieldApplied>;
    /**
     *  "countOnChangeFiltersApplyed" Cantidad de veces que el filtro se ha aplicado, sirve para suscribirse y aplicar el filtro.
     *  Esto se debe hacer porque no se puede lanzar un handler que modifica valores, durante una renderización.
     */
    countOnChangeFiltersApplied: number;
    /**
     * :popoverFilterData" para emerger el popuup de modificación campos
     */
    popoverFilterData?: PopoverFilterData;
    /**
     * Función utilizada para el dictionary
     */
    getLabel: GetLabelType;
}
export interface DynamicFilterStateWithActions extends DynamicFilterState {
    actions: {
        /**
         * inicializa el estado del componente con los filtros que provienen desde afuera
         * @param initialFiltersApplied Filtros iniciales
         */
        init: (initialFiltersApplied: Array<InitialFilterApplied>) => void;
        /**
         *  "setElementRef" establece la referencia al elemento (inputFilter) desde donde se desprende el listado de campos
         */
        setElementRef: (ref: MutableRefObject<HTMLElement | null>) => void;
        /**
         * Obtiene la referencia al elemento (inputFilter) desde donde se desprende el listado de campos
         */
        getElementRef: () => MutableRefObject<HTMLElement | null> | null;
        /**
         * Obtiene el Campo dado el nombre
         * @param name
         * @returns Field o undefined si no se encuentra
         */
        getFieldByName: (name: string) => FilterField;
        /**
         * remueve un filtro si existe, y dispara el trigger de onChangeFilters
         * @param id //identificador unico de un filtro
         */
        removeFilter: (id: number) => void;
        /**
         *
         * @param anchorEl Elemento de donde va emerger el popup
         * @param field Campo por el cual se va filtrar
         * @returns
         */
        showPopoverFilterForAdd: (field: FilterField) => void;
        /**
         * Muestra la ventan de edición de un filtro aplicado
         * @param anchorEl Anchor de elemento desde donde debe emerger
         * @param filterToEdit Filtro a editar
         * @returns
         */
        showPopoverFilterForEdit: (filterToEdit: FilterFieldApplied) => void;
        /**
         * Oculta la ventana de edición
         * @param stayInEdition determina si continua en edicióin
         */
        hidePopoverFilter: (stayInEdition: boolean) => void;
        /**
         * Limpia todos los filtros aplicados menos los fixed
         */
        clearFilters: VoidFunction;
        /**
         * llama al onChangeFilters proporcionado en los props del componente
         */
        fireOnChangeFilters: VoidFunction;
        /**
         * Función encargada de encontrar un Id par un nuevo filtro
         * @returns Id de filtro
         */
        getNewId: () => number;
        /**
         * Agrega un filtro setedo y correcto a los filtros aplicados (applyedFilters)
         * @param newFilter Filtro a agregar
         * @returns
         */
        addFilter: (newFilter: FilterFieldApplied) => void;
        /**
         * Modifica un filtro que se encuentra en applyedFilters
         * @param filterToEdit filtro a editar
         * @returns
         */
        updateFilter: (filterToEdit: FilterToEditApply) => void;
        /**
         * Modifica el texto que se visuliza en el InputFilter
         * @param text texto en el input
         * @returns
         */
        setInputData: (inputData: string) => void;
        /**
         * Modifica el estado de edición del componente
         * @param newInEdition Estado de edición
         * @returns
         */
        setInEdition: (newInEdition: boolean) => void;
        /**
         * Modifica los estados que se actualizan externamente al Store
         * @param newIsMobile
         * @returns
         */
        setExternalState: (newExternalState: ExternalOwnerState) => void;
        /**
         * Establece la función de apertura del menuu de campos
         * @param anchorEl
         * @returns
         */
        openPopoverMenuFields: () => void;
        /**
         * Limpia la función de apertura del menu de campos (por el valor anchorEl = undefined)
         */
        closePopoverMenuFields: (newInEdition?: boolean) => void;
        /**
         * actualiza el tamaño del componente
         */
        setSize: (size: Extract<Sizes, 'small' | 'medium'>) => void;
        /**
         * actualiza el estado del componente
         */
        setVisibleRefresh: (newVisibleRefresh: boolean) => void;
    };
}
export type InitialStoreProps = Pick<DynamicFilterState, 'automatic' | 'fields' | 'withAllField' | 'getLabel' | 'allField' | 'ownerState' | 'dataTestId' | 'size' | 'storeId' | 'visibleRefresh'>;
//# sourceMappingURL=types.d.ts.map