import { createContext, type ReactNode, useContext } from 'react';

/**
 * Contrato mínimo que los campos de una sección necesitan del formulario:
 * leer datos, escribir un campo y leer errores de validación.
 *
 * El layout accede a capacidades adicionales (patch, processing, isDirty…)
 * directamente desde `useHttp`, no desde este context.
 */
export interface SectionFormValue<T> {
    data: T;
    setData: {
        <K extends keyof T>(key: K, value: T[K]): void;
        (values: Partial<T>): void;
        (callback: (data: T) => T): void;
    };
    errors: Partial<Record<keyof T, string>>;
}

const SectionFormContext = createContext<SectionFormValue<
    Record<string, any>
> | null>(null);

export function SectionFormProvider({
    form,
    children,
}: {
    form: SectionFormValue<Record<string, any>>;
    children: ReactNode;
}) {
    return (
        <SectionFormContext.Provider value={form}>
            {children}
        </SectionFormContext.Provider>
    );
}

/**
 * Hook para acceder al formulario de la sección desde cualquier componente hijo.
 * El genérico `T` debe ser el tipo de datos de la sección (ej. `IdentificacionData`).
 */
export function useSectionForm<
    T extends Record<string, any>,
>(): SectionFormValue<T> {
    const form = useContext(SectionFormContext);
    if (!form) {
        throw new Error(
            'useSectionForm debe usarse dentro de <SectionFormProvider>',
        );
    }
    return form as unknown as SectionFormValue<T>;
}
