import { createComponent, createContext, mergeProps, splitProps, useContext, } from 'solid-js';
import { createFieldGroup } from './createFieldGroup';
import { createForm } from './createForm';
export function createFormHookContexts() {
    // We should never hit the `null` case here
    const fieldContext = createContext(null);
    function useFieldContext() {
        const field = useContext(fieldContext);
        // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
        if (!field) {
            throw new Error('`fieldContext` only works when within a `fieldComponent` passed to `createFormHook`');
        }
        return field;
    }
    // We should never hit the `null` case here
    const formContext = createContext(null);
    function useFormContext() {
        const form = useContext(formContext);
        // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
        if (!form) {
            throw new Error('`formContext` only works when within a `formComponent` passed to `createFormHook`');
        }
        return form;
    }
    return { fieldContext, useFieldContext, useFormContext, formContext };
}
export function createFormHook(opts) {
    function useAppForm(props) {
        const form = createForm(props);
        const AppForm = ((formProps) => {
            return (<opts.formContext.Provider value={form}>
          {formProps.children}
        </opts.formContext.Provider>);
        });
        const AppField = ((_props) => {
            const [childProps, fieldProps] = splitProps(_props, ['children']);
            return (<form.Field {...fieldProps}>
          {(field) => (<opts.fieldContext.Provider value={field}>
              {createComponent(() => childProps.children(Object.assign(field, opts.fieldComponents)), {})}
            </opts.fieldContext.Provider>)}
        </form.Field>);
        });
        const extendedForm = form;
        extendedForm.AppField = AppField;
        extendedForm.AppForm = AppForm;
        for (const [key, value] of Object.entries(opts.formComponents)) {
            // Since it's a generic I need to cast it to an object
            ;
            extendedForm[key] = value;
        }
        return extendedForm;
    }
    function withForm({ render, props, }) {
        return (innerProps) => createComponent(render, mergeProps(props ?? {}, innerProps));
    }
    function withFieldGroup({ render, props, defaultValues, }) {
        return function Render(innerProps) {
            const fieldGroupProps = {
                form: innerProps.form,
                fields: innerProps.fields,
                defaultValues,
                formComponents: opts.formComponents,
            };
            const fieldGroupApi = createFieldGroup(() => fieldGroupProps);
            return createComponent(render, mergeProps(props ?? {}, innerProps, { group: fieldGroupApi }));
        };
    }
    return {
        useAppForm,
        withForm,
        withFieldGroup,
    };
}
//# sourceMappingURL=createFormHook.jsx.map