import { ReactNode } from 'react';
import { Mode, SubmitErrorHandler, UseFormReturn } from 'react-hook-form';
import { ObjectSchema } from 'yup';
import { ObjectShape } from 'yup/lib/object';
/**
 * Form load states that determine when and how to update form values.
 *
 * - `initial`: Initial form state
 * - `new`: Form for creating a new record (add flow)
 * - `edit`: Form for editing an existing record (load from endpoint)
 * - `reload_values_provider`: Provider values must be reloaded before ready
 * - `ready`: Form loaded and ready to use
 * - `error`: Form load error
 */
export type FormStatusLoad = 'initial' | 'new' | 'edit' | 'reload_values_provider' | 'ready' | 'error';
export type RHFormValues = {};
/**
 * Tipo que define los valores iniciales del formulario.
 * Extiende FieldValues de React Hook Form para mayor flexibilidad.
 */
export type RHFormInitialValues<T extends RHFormValues> = Partial<T>;
/**
 * LiteralKeys es un tipo que define las claves literales del formulario. excepto statusLoad, que no es necesario que el usuario la aporte.
 */
export type LiteralKeys<T> = Exclude<Extract<keyof T, string>, 'statusLoad'>;
/**
 * StrictFormValues es un tipo que define los valores del formulario explicitamente.
 */
export type StrictFormValues<T extends RHFormValues> = Pick<RHFormInitialValues<T>, LiteralKeys<RHFormInitialValues<T>>>;
/**
 * Garantiza que el shape sólo contenga claves declaradas en el tipo del formulario.
 * Si usa un key que no está en el tipo del formulario, se devuelve never. Protegiendo el ingreso de claves diferentes.
 */
export type EnsureAllowedKeys<Shape, Allowed extends string> = Exclude<keyof Shape, Allowed> extends never ? Shape : never;
/**
 * YupShapeEntry es un tipo que define la entrada de un shape de Yup.
 */
type YupShapeEntry = ObjectShape[string];
/**
 * ValidationShape veririca que solo YupShapeEntry  puedan ser usados en algunos campos de RHFormValues.
 */
export type ValidationShape<T extends RHFormValues> = Partial<Record<LiteralKeys<T>, YupShapeEntry>>;
/**
 * Symbol que contiene el ValidationSchema que lo hace diferente a ObjectSchema normal de Yup.
 */
export declare const VALIDATION_SCHEMA_BRAND: unique symbol;
/**
 * Symbol que identifica que un ValidationShape fue construido mediante createValidationObject.
 */
export declare const VALIDATION_OBJECT_BRAND: unique symbol;
/**
 * Symbol que identifica que un ValidationShape parcial fue construido mediante createValidationPartialObject.
 */
export declare const VALIDATION_PARTIAL_OBJECT_BRAND: unique symbol;
/**
 * ValidationSchema es un tipo que define el schema de validación del formulario. Aporta el brand VALIDATION_SCHEMA_BRAND para hacer diferentes a ObjectSchema normal de Yup.
 * y asi poder garantizar que se use la función createValidationSchema para crear la schema.
 */
export type ValidationSchema<T extends RHFormValues> = ObjectSchema<any> & {
    /**
     * Aunque no se use en el codigo a nivel de javascript, es necesario para que el tipo de la schema para hacerlos diferente a ObjectSchema. y obliga
     * a que se use la función createValidationSchema para crear la schema.
     */
    readonly [VALIDATION_SCHEMA_BRAND]: ValidationShape<T>;
};
/**
 * ValidationFullObject garantiza que el shape sea construido mediante createValidationObject.
 * con base en los partialObjectShape que se le pasan a createValidationObject.
 */
export type ValidationFullObject<T extends RHFormValues> = ValidationShape<T> & {
    readonly [VALIDATION_OBJECT_BRAND]: true;
};
/**
 * ValidationPartialObject garantiza que el shape parcial sea construido mediante createValidationPartialObject.
 */
export type ValidationPartialObject<T extends RHFormValues> = ValidationShape<T> & {
    readonly [VALIDATION_PARTIAL_OBJECT_BRAND]: true;
};
/**
 * Propiedades del componente principal RHFormProvider.
 * Define la interfaz para crear formularios con React Hook Form y validación Yup.
 */
export interface RHFormProviderProps<T extends RHFormValues> {
    /** Elementos hijos del formulario */
    children: ReactNode;
    /** Función que se ejecuta al enviar el formulario con los datos validados */
    onSubmit: ((data: T) => void) | ((data: T) => Promise<void>);
    /**
     * Cuando hay un error en la validación del formulario, se ejecuta esta función.
     */
    onSubmitError?: SubmitErrorHandler<T>;
    /** Valores iniciales del formulario si es un new o cargados del backend si son edit */
    values: RHFormInitialValues<T>;
    /** Esquema de validación de Yup */
    validationSchema: ValidationSchema<T>;
    /** Estado de carga del formulario (opcional, por defecto 'ready') */
    statusLoad?: FormStatusLoad;
    /** Clases CSS adicionales (opcional) */
    className?: string;
    /** Modo de validación del formulario (opcional) */
    mode?: Mode;
}
/**
 * Propiedades del componente FormProviderCustom.
 * Combina las propiedades de React Hook Form con las propiedades personalizadas del formulario.
 */
export interface FormProviderCustomProps<T extends RHFormValues> extends RHFormProviderProps<T> {
    formMethods: UseFormReturn<T, undefined, T>;
}
/**
 * Argumentos para el hook useCustomForm.
 * Define los parámetros necesarios para configurar un formulario personalizado.
 */
export interface CustomFormArguments<T extends RHFormValues> {
    /** Valores iniciales del formulario */
    values: RHFormInitialValues<T>;
    /** Esquema de validación de Yup */
    validationSchema: ValidationSchema<T>;
    /** Estado de carga del formulario (opcional) */
    statusLoad?: FormStatusLoad;
    /** Modo de validación del formulario (opcional) */
    mode?: Mode;
}
/**
 * Interfaz que define los métodos expuestos a través de la ref del RHFormProvider.
 * Permite acceso programático a los métodos de React Hook Form desde componentes padre.
 */
export interface RHFormProviderRef<T extends RHFormValues> {
    /** Objeto completo con todos los métodos de React Hook Form */
    formMethods: UseFormReturn<T, undefined, T>;
    onSubmit: (data: T) => void;
}
export {};
//# sourceMappingURL=types.d.ts.map