import { ReactNode } from 'react';
import { DragResizeWindowPropsRND } from '../../../../../DragResizeWindowRND/types';
import { PopupStatus } from '../../../PopupsViewer/types';
import { MFBaseProps } from '../../../../../MFLoader/types';
import { JSX_REACT_NODE, ModuleAction, WindowOptions } from '../../../../../WindowBase/types';
import { DynamicMFStore } from '../../../../../WindowBase/contexts/DynamicMFParmsContext/store';
import { WindowQueryCloseHandler } from '../../../../../areas/types';
export type PopupVariantType = 'normal' | 'small' | 'large';
type PartialExcept<T, K extends keyof T> = Partial<Omit<T, K>> & Pick<T, K>;
type PopupSelectedReason = 'add' | 'remove' | 'select';
export interface PopupStorePropsBase extends PartialExcept<Pick<DragResizeWindowPropsRND, 'bounds' | 'defaultPosition' | 'minWidth' | 'minHeight' | 'maxWidth' | 'maxHeight' | 'resizable' | 'draggable' | 'allowHeightResizeContainer' | 'allowWidthResizeContainer'>, 'defaultPosition'> {
    /**
     * "moduleId" Identificador del módulo, para Microfrontends
     */
    moduleId?: string;
    /**
     * "winType" Tipo de ventana
     */
    winType: 'microfrontend' | 'component';
    /**
     * "popupId" Indetificador del popupId
     */
    popupId: string;
    /**
     * "status" Estado del popup
     */
    status: PopupStatus;
    /**
     * "windowOptions" Opciones de la ventana
     */
    windowOptions?: WindowOptions;
    /**
     * "variant" Variante del popup //TODO: Creo que esto es size
     */
    variant?: PopupVariantType;
    /**
     * "iconUrl" Icono de la ventan
     */
    iconUrl: string;
    /**
     * "title" Titulo de la ventan
     */
    title: string;
    /**
     * "subTitle" Subtitulo de la ventan
     */
    subTitle?: string;
    /**
     * "editionInfo" Mensaje que muestra el registro que se está editando.
     */
    editionInfo?: string;
    /**
     * draggable Indica si el popup es arrastrable, default true
     */
    draggable?: boolean;
    /**
     * resizable Indica si el popup es redimensionable, default true
     */
    resizable?: boolean;
    /**
     * "zIndex" Zindex del popup, tener en cuenta que se usa el baseZindex como offset para el zIndex
     */
    zIndex: number;
    /**
     * "onMouseDown" Evento nativo del Draggable, para tomar acciones externamente
     */
    onMouseDown?: (e: MouseEvent) => void;
    /**
     * "loading" Indica si el popup está cargando
     */
    loading?: boolean;
    /**
     * "moduleActions" Acciones del módulo
     */
    moduleActions?: ModuleAction[];
    /**
     * "version" Versión del Microfrontend
     */
    version?: string;
    /**
     * "buildTime" BuildTime del Microfrontend
     */
    buildTime?: string;
    /**
     * Optional close-confirmation override registered by the mounted content.
     */
    fnQueryClose?: WindowQueryCloseHandler;
    /**
     * "dynamicMFStore" Almacén de microfrontends din
     */
    dynamicMFStore: DynamicMFStore;
    /**
     * dynamic params
     */
    dynamicParams?: Record<string, any>;
    /**
     * "collapsed" Indica si el popup está colapsado
     */
    collapsed?: boolean;
    /**
     * "maximized" Indica si el popup está maximizado
     */
    maximized?: boolean;
    /**
     * "groupId" Grupo del popup, si no se especifica, se debe almacenar en el group id "global"
     */
    groupId: string;
    /**
     * "onRemove" Función de cierre del popup
     */
    onRemove?: (id: string) => void;
    /**
     * "parentId" es un id que permitira cerrar todos los popups que dependan de él
     */
    parentId?: string;
    /**
     * "enforceVisibleCount" cuando cambia este valor, el popup se reenfoca con scrollLeft y scrollTop, esto es especialmente util en area cuando
     * se utiliza replaceMeId para aseguar que el popup que se esta intentando visualizar realmente se vea.
     */
    enforceVisibleCount?: number;
    /**
     * "onSelectedPopupIdChange" Notifica cuando el popup seleccionado cambia
     */
    onSelectedPopupIdChange?: (groupId: string, popupId?: string, reason?: PopupSelectedReason) => void;
}
export interface PopupStoreComponentProps extends PopupStorePropsBase {
    /**
     * "winType" Tipo de ventana
     */
    winType: 'component';
    /**
     * "componentProps" Propiedades que se le pasan al componente que se va a mostrar en el popup.
     */
    componentProps?: Record<string, any>;
    /**
     * "component" Componente que se va a mostrar en el popup.
     */
    component: JSX_REACT_NODE;
}
export interface PopupStoreMFProps extends PopupStorePropsBase {
    /**
     * "winType" Tipo de ventana
     */
    winType: 'microfrontend';
    /**
     * "mfProps" Propiedades de la ventana padre
     */
    mfProps: MFBaseProps;
    /**
     * "moduleId" Identificador del módulo, para Microfrontends
     */
    moduleId: string;
}
/**
 * Props que tiene un popup en el store
 */
export type PopupStoreProps = PopupStoreComponentProps | PopupStoreMFProps;
/**
 * Props para usar en el initialPopups
 */
export type PopupInitialComponentProps = Omit<PopupStoreComponentProps, 'status' | 'version' | 'dynamicMFStore'>;
export type PopupInitialMFProps = Omit<PopupStoreMFProps, 'status' | 'version' | 'dynamicMFStore'>;
export type PopupInitialProps = PopupInitialComponentProps | PopupInitialMFProps;
/**
 * Props para usar en el addPopup
 */
export type PopupAddComponentProps = Omit<PopupStoreComponentProps, 'status' | 'zIndex' | 'version' | 'dynamicMFStore' | 'groupId'> & {
    /**
     * "groupId" Grupo del popup, si no se especifica, se debe almacenar en el group id "global"
     */
    groupId?: string;
    /**
     * "dynamicMFStore" Almacén de datos para los microfrontends
     */
    dynamicMFStore?: DynamicMFStore;
};
export type PopupAddMFProps = Omit<PopupStoreMFProps, 'status' | 'zIndex' | 'version' | 'dynamicMFStore' | 'groupId'> & {
    /**
     * "groupId" Grupo del popup, si no se especifica, se debe almacenar en el group id "global"
     */
    groupId?: string;
    /**
     * "dynamicMFStore" Almacén de datos para los microfrontends
     */
    dynamicMFStore?: DynamicMFStore;
};
export type PopupAddProps = PopupAddComponentProps | PopupAddMFProps;
/**
 * Grupo de popups
 */
export type PopupGroup = {
    /**
     * "id" Id del grupo
     */
    id: string;
    /**
     * "selectedPopupId" Id del popup seleccionado, en el grupo, si no se especifica, no se selecciona ninguno
     */
    selectedPopupId?: string;
    /**
     * "count" Cantidad de popups en el grupo
     */
    count: number;
};
/**
 * Interface que define el store del componente (variables y funciones )
 */
export interface PopupsProviderStoreState {
    /**
     * Id del store, para identificarlo en las herramientas de redux.
     */
    storeId?: string;
    /**
     *  "poupsIds" Poups para saber en que orden se muestran
     */
    popupsIds: string[];
    /**
     *  "hashPoups" Poups
     */
    hashPopups: Record<string, PopupStoreProps>;
    /**
     * "baseZindex" zIndex donde empieza el primer popup
     */
    baseZindex: number;
    /**
     * "currentZindex" Zindex actual, cada vez que se lance un popup se incrementa en 1,
     * si se cierran todos, vuelve a baseZindex.
     */
    currentZindex: number;
    /**
     * "hashGroups" Grupos de popups
     */
    hashGroups: Record<string, PopupGroup>;
}
export type OpenPopupOptions = {
    /**
     * Indica si se deben cerrar primero los otros propus.
     */
    closeOthers: boolean;
};
export interface PopupsProviderStoreStateWithActions extends PopupsProviderStoreState {
    popupsActions: {
        /**
         * @description
         */
        init(layersStore: PopupInitialProps[]): void;
        /**
         * Agrega una un poupup nuevo al hash de popups y al array de ids, NOT IMPLEMENTED YET
         */
        unColapseLayoutItem: (popupId: string) => void;
        /**
         * Colapsa un popup NOT IMPLEMENTED YET
         */
        colapseLayoutItem: (popupId: string) => void;
        /**
         * "addPopup" Agrega un popup nuevo al hash de popups y al array de ids
         */
        addPopup: (popupProps: PopupAddProps, options?: OpenPopupOptions) => void;
        /**
         * Remueve el poupup del hash de poups y de arrays de ids
         */
        removePopup: (popupId: string) => void;
        /**
         * Pone el popup  con zIndex igual a currentIndex y lo amuneta en uno.
         */
        bringPopupOnFront: (popupId: string, withEnforceVisible?: boolean) => void;
        /**
         * Replace the default popup close flow with a guarded close handler.
         */
        setFnQueryClose: (popupId: string, fn: WindowQueryCloseHandler) => void;
        /**
         * removePopupsByGroupId: Elimina los popups de un grupo
         */
        closePopupsByGroupId: (groupId: string) => void;
        /**
         * "removeAllPopupsByGroupId" Elimina todos los popups de un grupo, esta opción se usa cuando se destruye el popupsViewer y no se alcanza hacer la transción de cierre.
         * Para estos casos es obligatorio eleminarlos del store.
         */
        removeAllPopupsByGroupId: (groupId: string) => void;
        /**
         * closeAllPopupsByParentId: Cierra todos los popups que dependan de un popup padre, normalmente se usa en areas cuando se cierra una layout
         */
        closeAllPopupsByParentId: (parentId: string) => void;
        /**
         * setSelectedPopupId: Establece el popup seleccionado, undefined para deseleccionar
         */
        setSelectedPopupId: (groupId: string, popupId?: string) => void;
    };
    /**
     * Acciones específicas que afecta a un solo popup, y no modifica el hash de popups de otros popups.
     */
    popupActions: {
        /**
         * pasa el status a init, no se ejecutan las transiciones, porque el popup viene de estar hide .
         */
        show: (popupId: string) => void;
        /**
         * pasa el status a closing para que las las transiciones se ejecuten.
         */
        close: (popupId: string, useFnQueryClose?: boolean) => void;
        /**
         * Modifica un popup espeficio
         */
        update: (popupId: string, popupProps: Partial<Omit<PopupStoreProps, 'status'>>) => void;
        /**
         * pasa el status a hide, no se ejecutan las transiciones, porque el popup se esconde inmediatamente.
         */
        hide: (popupId: string) => void;
        /**
         * startProgress: Inicia el progreso del popup
         */
        startProgress: (popupId: string) => void;
        /**
         * stopProgress: Detiene el progreso del popup
         */
        stopProgress: (popupId: string) => void;
        /**
         * setActions: Establece las acciones del popup
         */
        setActions: (popupId: string, actions: ModuleAction[], version?: string, buildTime?: string) => void;
    };
}
export type DefaultPopupsStoreProps = PopupsProviderStoreState;
export type InitialPopupsStoreProps = Pick<PopupsProviderStoreState, 'baseZindex' | 'storeId'>;
export interface PopupsProviderProps extends Pick<PopupsProviderStoreState, 'baseZindex' | 'storeId'> {
    /**
     * "storeDevtoolsEnabled" Determina si se debe usar devtools para el store
     */
    storeDevtoolsEnabled?: boolean;
    /**
     * Poopus abiertos desde el principio, puede servir para abrir los poupus previamente cargados en las cookies
     */
    initialPopups?: PopupInitialProps[];
    /**
     * children
     */
    children: ReactNode;
}
export {};
//# sourceMappingURL=types.d.ts.map