import { GetLabelType } from '@m4l/core';
import { Sizes } from '@m4l/styles';
import { MutableRefObject } from 'react';
import { DynamicSortProps, InitialSortApplied, OwnerState, SortField, SortFieldApplied, SortToEditApply } from '../types';
export type OpenFor = 'add' | 'edit';
export interface PopoverSortDataBase {
    /**
     *  "openFor" motivo de apertura del popup
     */
    openFor: OpenFor;
}
export interface PopoverSortDataAdd extends PopoverSortDataBase {
    openFor: 'add';
    /**
     *  "field" Campo por el cual se va a filtrar
     */
    field: SortField;
}
export interface PopoverSortDataEdit extends PopoverSortDataBase {
    openFor: 'edit';
    /**
     *  "filter" sort que se va a editar
     */
    sort: SortFieldApplied;
}
/**
 *
 * Tipo usado para cuado se va agregar o modificar un sort
 */
export type PopoverSortData = PopoverSortDataAdd | PopoverSortDataEdit;
/**
 * Interface que define el estado del componente
 */
export interface DynamicSortState extends Pick<DynamicSortProps, 'fields' | 'automatic' | 'dataTestId' | 'size' | 'visibleRefresh'> {
    /**
     *  "storeId" identificador del store
     */
    storeId?: string;
    /**
     *  "ownerState" estado a nivel de clases del componente
     */
    ownerState: OwnerState;
    /**
     *  "isOpenPopoverMenuFields" determina si se debe abrir el menú de campos
     */
    isOpenPopoverMenuFields?: boolean;
    /**
     *  "inputData" texto en el InputSort
     */
    inputData: string;
    /**
     * Campos disponibles para filtrar
     */
    availableFields: Array<SortField>;
    /**
     *  "applyedFilters" sorts aplicados actualmente
     */
    appliedSorts: Array<SortFieldApplied>;
    /**
     *  "countOnChangeSortsApplyed" Cantidad de veces que el sort se ha aplicado, sirve para suscribirse y aplicar el sort.
     *  Esto se debe hacer porque no se puede lanzar un handler que modifica valores, durante una renderización.
     */
    countOnChangeSortsApplyed: number;
    /** popoverFilterData: para emerger el popuup de modificación campos  */
    popoverSortData?: PopoverSortData;
    /**
     * Función utilizada para el dictionary
     */
    getLabel: GetLabelType;
    /**
     * size: tamaño del componente
     */
    size: Extract<Sizes, 'small' | 'medium'>;
}
export interface DynamicSortStateWithActions extends DynamicSortState {
    actions: {
        /**
         * inicializa el estado del componente con los sorts que provienen desde afuera
         * @param initialSortApplyed sorts iniciales
         */
        init: (initialSortApplyed: Array<InitialSortApplied>) => void;
        /**
         *  "setElementRef" establece la referencia al elemento (inputFilter) desde donde se desprende el listado de campos
         */
        setElementRef: (ref: MutableRefObject<HTMLElement | null>) => void;
        /**
         *  "getElementRef" obtiene la referencia al elemento (inputFilter) desde donde se desprende el listado de campos
         */
        getElementRef: () => MutableRefObject<HTMLElement | null> | null;
        /**
         * Objetiene el Campo dado el nombre
         * @param name
         * @returns Field o undefined si no se encuentra
         */
        getFieldByName: (name: string) => SortField;
        /**
         * remueve un sort si existe, y dispara el trigger de onChangeSorts
         * @param id //identificador unico de un sort
         */
        removeSort: (id: number) => void;
        /**
         * remueve un sort externo por nombre de columna (para uso desde DataGrid)
         * @param columnName nombre de la columna
         */
        removeExternalSort: (columnName: string) => void;
        /**
         *
         * @param anchorEl Elemento de donde va emerger el popup
         * @param field Campo por el cual se va filtrar
         * @returns
         */
        showPopoverSortForAdd: (field: SortField) => void;
        /**
         * Muestra la ventan de edición de un sort aplicado
         * @param anchorEl Anchor de elemento desde donde debe emerger
         * @param sortToEdit sort a editar
         * @returns
         */
        showPopoverSortForEdit: (sortToEdit: SortFieldApplied) => void;
        /**
         * Oculta la ventana de edición
         * @param stayInEditon determina si continua en edicióin
         */
        hidePopoverSort: (stayInEditon: boolean) => void;
        /**
         * Limpia todos los sorts aplicados menos los fixed
         */
        clearSorts: VoidFunction;
        /**
         * llama al fireOnChangeSorts proporcionado en los props del componente
         */
        fireOnChangeSorts: VoidFunction;
        /**
         * Función encargada de encontrar un Id par un nuevo sort
         * @returns Id de sort
         */
        getNewId: () => number;
        /**
         * Agrega un sort setedo y correcto a los sorts aplicados (applyedFilters)
         * @param newSort Sort a agregar
         * @returns
         */
        addSort: (newSort: SortFieldApplied) => void;
        /**
         * Agrega un sort externo a los sorts aplicados (applyedFilters)
         * @param newSort Sort a agregar
         * @returns
         */
        addExternalSort: (newSort: SortFieldApplied) => void;
        /**
         * Modifica un sort que se encuentra en applyedFilters
         * @param sortToEdit sort a editar
         * @returns
         */
        updateSort: (sortToEdit: SortToEditApply) => void;
        /**
         * Modifica el texto que se visuliza en el InputSort
         * @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;
        /**
         * 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<DynamicSortState, 'automatic' | 'fields' | 'getLabel' | 'ownerState' | 'dataTestId' | 'size' | 'storeId' | 'visibleRefresh'>;
//# sourceMappingURL=types.d.ts.map