import { type PropsWithChildren } from 'react';
import type { ActionCollectionConfig, StateSetter, ActionCollectionResult, StateGetter, BaseMetadata, MetadataSetter, GlobalStoreCallbacks, UseHookConfig, ObservableFragment, MetadataGetter } from './types';
export type ContextProviderAPI<State, Metadata extends BaseMetadata | unknown> = {
    setMetadata: MetadataSetter<Metadata>;
    setState: StateSetter<State>;
    getState: StateGetter<State>;
    getMetadata: () => Metadata;
    actions: Record<string, (...args: any[]) => void>;
};
export type ContextProvider<State, Metadata extends BaseMetadata | unknown> = React.FC<PropsWithChildren<{
    value?: State | ((initialValue: State) => State);
    ref?: React.RefObject<ContextProviderAPI<State, Metadata>>;
}>>;
export type StateControlsHook<State, StateMutator, Metadata extends BaseMetadata | unknown> = () => Readonly<[
    retriever: StateGetter<State>,
    mutator: StateMutator,
    metadata: MetadataGetter<Metadata>
]>;
export type ObservableBuilderHook<State, StateMutator, Metadata extends BaseMetadata | unknown> = <Fragment>(this: ContextHook<State, StateMutator, Metadata>, mainSelector: (state: State) => Fragment, args?: {
    isEqual?: (current: Fragment, next: Fragment) => boolean;
    isEqualRoot?: (current: State, next: State) => boolean;
    name?: string;
}) => ObservableFragment<Fragment>;
export interface ContextBaseHook<State, StateMutator, Metadata extends BaseMetadata | unknown> {
    (): Readonly<[state: State, stateMutator: StateMutator, metadata: Metadata]>;
    <Derivate>(selector: (state: State) => Derivate, dependencies?: unknown[]): Readonly<[
        state: Derivate,
        stateMutator: StateMutator,
        metadata: Metadata
    ]>;
    <Derivate>(selector: (state: State) => Derivate, config?: UseHookConfig<Derivate, State>): Readonly<[
        state: Derivate,
        stateMutator: StateMutator,
        metadata: Metadata
    ]>;
}
export interface ContextHook<State, StateMutator, Metadata extends BaseMetadata | unknown> extends HookExtensions<State, StateMutator, Metadata>, ContextBaseHook<State, StateMutator, Metadata> {
}
export type HookExtensions<State, StateMutator, Metadata extends BaseMetadata | unknown> = {
    stateControls: () => readonly [
        useStateControls: StateControlsHook<State, StateMutator, Metadata>,
        useObservableBuilder: ObservableBuilderHook<State, StateMutator, Metadata>
    ];
    createSelectorHook: <Derivate>(this: ContextHook<State, StateMutator, Metadata>, selector: (state: State) => Derivate, args?: Omit<UseHookConfig<Derivate, State>, 'dependencies'> & {
        name?: string;
    }) => ContextBaseHook<Derivate, StateMutator, Metadata>;
};
export interface CreateContext {
    <State>(value: State | (() => State)): [
        ContextHook<State, StateSetter<State>, BaseMetadata>,
        ContextProvider<State, BaseMetadata>
    ];
    <State, Metadata extends BaseMetadata | unknown, ActionsConfig extends ActionCollectionConfig<State, Metadata> | null | {}, PublicStateMutator = keyof ActionsConfig extends never | undefined ? StateSetter<State> : ActionCollectionResult<State, Metadata, NonNullable<ActionsConfig>>>(value: State | (() => State), args: {
        name?: string;
        metadata?: Metadata | (() => Metadata);
        callbacks?: GlobalStoreCallbacks<State, Metadata> & {
            onUnMount?: () => void;
        };
        actions?: ActionsConfig;
    }): [ContextHook<State, PublicStateMutator, Metadata>, ContextProvider<State, Metadata>];
    <State, Metadata extends BaseMetadata | unknown, ActionsConfig extends ActionCollectionConfig<State, Metadata>>(value: State | (() => State), args: {
        name?: string;
        metadata?: Metadata | (() => Metadata);
        callbacks?: GlobalStoreCallbacks<State, Metadata> & {
            onUnMount?: () => void;
        };
        actions: ActionsConfig;
    }): [
        ContextHook<State, ActionCollectionResult<State, Metadata, ActionsConfig>, Metadata>,
        ContextProvider<State, Metadata>
    ];
}
export declare const createContext: CreateContext;
export default createContext;
