import * as react from 'react';
import { SetStateAction, FC } from 'react';
import { Socket } from 'socket.io-client';
import * as react_jsx_runtime from 'react/jsx-runtime';

interface RemoveArgsType {
    reset?: boolean;
}
type Remove = (options?: RemoveArgsType) => void;
type UseLocalStorageReturnType<T> = {
    value: T;
    getValue: () => T | null;
    setValue: (value: T | SetStateAction<T>) => T;
    removeValue: Remove;
};

/**
 * useLocalStorage React Hook for managing state with local storage.
 * @template T - The type of the value to be stored.
 * @param {string} key - The key under which the value is stored.
 * @param {T} initialValue - The initial value.
 * @returns {[T, Function]} The current value and a function to update it.
 */
declare const useLocalStorage: <T>(key: string, initialValue: T) => UseLocalStorageReturnType<T>;

type SetValueCallbackType<T> = (prevState: T) => T;

/**
 * useToggle React Hook for managing boolean state.
 * @param {boolean} initialValue - The initial value.
 * @returns {[boolean, Function]} The current value and a function to toggle it.
 */
declare const useToggle: (initialValue?: boolean) => [value: boolean, (value?: boolean | SetValueCallbackType<boolean>) => void];

interface UseSocketEventsProps<T> {
    callback: (args?: T) => Promise<T> | void;
    event: string;
    debug?: boolean;
    socketProvider?: Socket;
}

/**
 * useSocketEvent
 * "useSocketEvent" is a custom hook that listens to a socket event and executes a callback function when the event is triggered.
 * @param callback
 * @param event
 * @param debug
 * @param socketProvider
 */
declare const useSocketEvent: <T>({ callback, event, debug, socketProvider }: UseSocketEventsProps<T>) => void;

interface IDialogProps {
    open: boolean;
    message?: string;
    onConfirm: () => void;
    onCancel?: () => void;
}
interface IUseConfirmType {
    message?: string;
    onConfirm: () => void;
    onCancel?: () => void;
    dialog?: FC<IDialogProps>;
}

declare const useConfirm: ({ onConfirm, onCancel, message, dialog: CustomDialog }: IUseConfirmType) => {
    toggle: (value?: boolean | SetValueCallbackType<boolean> | undefined) => void;
    dialog: string | number | boolean | react_jsx_runtime.JSX.Element | Iterable<react.ReactNode> | null | undefined;
};

declare const _useAsync: <T, E = Error>(asyncFunction: () => Promise<T>) => {
    execute: () => void;
    inProgress: boolean;
    value: T | null;
    error: E | null;
};

export { _useAsync, useConfirm, useLocalStorage, useSocketEvent, useToggle };
