import { ReactElement, ReactNode } from 'react';
import { Theme } from '@mui/material/styles';
import { Sizes } from '@m4l/styles';
import { ContentAreaSlots, ContentSlots, StepperFooterSlots, StepperSlots } from './slots/StepperEnum';
import { STEPPER_PREFIX_NAME } from './constants';
import { M4LOverridesStyleRules } from '../../@types/augmentations';
import { Step as StepComponent } from './subcomponents/StepperContent/subcomponents/Step';
import { ButtonProps } from '../extended/mui/Button';
export type Orientation = 'horizontal' | 'vertical';
export type IndicatorType = 'number' | 'dot';
export type FormData = Record<string, string | number | boolean | null | undefined>;
export type VisibilityData = Record<string, string | number | boolean | null | undefined>;
export type Step = {
    /**
     * Clave única que identifica el step.
     */
    key: string;
    /**
     * Título del step.
     */
    title: string;
    /**
     * Descripción del step.
     */
    description?: string;
    /**
     * Icono del step.
     */
    icon?: string;
    /**
     * Array con los campos que se deben validar en el step.
     */
    validationFields?: string[];
    /**
     * Función que determina si el step se debe mostrar.
     * @param formData - Datos del formulario.
     * @param visibilityData - Datos adicionales para evaluar visibilidad (ej: objectId).
     * @returns true si el step se debe mostrar, false en caso contrario.
     * Si no se proporciona, el step siempre se muestra.
     */
    visibilityCondition?: (formData?: FormData, visibilityData?: VisibilityData) => boolean;
};
export interface StepperProps {
    /**
     * Children opcional para inyectar componentes adicionales
     */
    children?: React.ReactNode;
    /**
     *  "storeId" identificador del store
     */
    storeId?: string;
    /**
     *  "storeDevtoolsEnabled" determina si se debe usar devtools para el store
     */
    storeDevtoolsEnabled?: boolean;
    /**
     * "visibleTitle": Propiedad que ejecuta condición para visualizar los titulos en el SteppArea
     */
    visibleTitle?: boolean;
    /**
     * Array con la configuración de cada step.
     */
    steps: Step[];
    /**
     * Datos adicionales para evaluar visibilityCondition de los steps.
     * Por ejemplo, objectId para determinar si mostrar steps después del submit inicial.
     */
    visibilityData?: VisibilityData;
    /**
     * Indica que tipo de indicador se usará en el Stepper.
     * Puede ser 'number' para números o 'dot' para puntos.
     */
    indicatorType?: IndicatorType;
    /**
     * "orientation" define la orientación del Stepper.
     */
    orientation?: Orientation;
    /**
     * Tamaño del componente, puede ser uno de los valores definidos en 'small' , 'medium'
     */
    size?: Extract<Sizes, 'small' | 'medium'>;
    /**
     * Clase personalizada para el Stepper.
     */
    className?: string;
    /**
     * Key del step en el que se desea iniciar el Stepper.
     * Si se proporciona, valida los steps anteriores antes de navegar al step indicado.
     * Si algún step anterior tiene errores, inicia en el primer step con errores.
     * Lanza Error si la key no corresponde a ningún step.
     */
    initialStepKey?: string;
}
/**
 * Props del StepperContent
 */
export interface StepperContentProps {
    /**
     * Array de componentes Step
     */
    children: ReactElement<typeof StepComponent>[];
}
/**
 * Props del Step
 */
export interface StepProps {
    /**
     * Clave única del step que determina cuándo se renderiza
     */
    stepKey: string;
    /**
     * Contenido del step
     */
    children: ReactNode;
}
/**
 * Props del ContentArea
 */
export interface ContentAreaProps {
    children: ReactNode;
}
/**
 * Props del Indicator
 */
export interface IndicatorProps {
    /**
     * El número del paso actual.
     */
    step: number;
    /**
     * Indica si el paso es el actual.
     */
    currentStep: number;
    /**
     * El número total de pasos.
     */
    totalSteps: number;
    /**
     * El índice original del paso en el array completo de pasos.
     * Se usa para buscar el estado de validación en stepValidationStatus.
     */
    originalStepIndex: number;
}
/**
 * Props del StepperFooter
 */
export interface StepperFooterProps {
    children?: ReactNode;
}
/**
 * Props del StepperFooterLeftActions
 */
export interface StepperFooterLeftActionsProps {
    children?: ReactNode;
}
/**
 * Props para los botones del Stepper que extienden las props de Button de extended/mui
 */
export interface StepperButtonProps extends Omit<ButtonProps, 'label'> {
    /**
     * Forzar a un una versión especifica no importando el dispositivo
     */
    forceIsMobile?: boolean;
    label?: string;
}
/**
 * Props del StepperFooterRightActions
 */
export interface StepperFooterRightActionsProps {
    children?: ReactNode;
}
export interface StepperOwnerState extends Pick<StepperProps, 'visibleTitle'>, Record<string, unknown> {
    step?: number;
    currentStep?: number;
    totalSteps?: number;
    orientation?: Orientation;
    indicatorType?: IndicatorType;
    size?: Extract<Sizes, 'small' | 'medium'>;
    stepValidationStatus?: Record<number, boolean>;
    isStepVisible?: boolean;
}
/**
 * Representa un step junto con su posición original en el array de steps.
 * Se usa para mantener la referencia al índice original después de filtrar steps ocultos.
 */
export interface StepWithIndex {
    /**
     * El objeto Step con toda su configuración (key, title, validationFields, etc.)
     */
    step: Step;
    /**
     * El índice del step en el array original de steps.
     * Es necesario para actualizar correctamente el stepValidationStatus del store.
     */
    originalIndex: number;
}
export type StepperSlotsType = StepperSlots | ContentSlots | ContentAreaSlots | StepperFooterSlots;
export type StepperStyles = M4LOverridesStyleRules<StepperSlotsType, typeof STEPPER_PREFIX_NAME, Theme>;
//# sourceMappingURL=types.d.ts.map