import * as Core from "@ariakit/components/dialog/dialog-store";
import { useStore } from "@ariakit/react-store";
import type { Store } from "@ariakit/react-store";
import type {
  DisclosureStoreFunctions,
  DisclosureStoreOptions,
  DisclosureStoreState,
} from "../disclosure/disclosure-store.ts";
import { useDisclosureStoreProps } from "../disclosure/disclosure-store.ts";

export function useDialogStoreProps<T extends Core.DialogStore>(
  store: T,
  update: () => void,
  props: DialogStoreProps,
) {
  return useDisclosureStoreProps(store, update, props);
}

/**
 * Creates a dialog store to control the state of
 * [Dialog](https://ariakit.com/components/dialog) components.
 * @see https://ariakit.com/components/dialog
 * @example
 * ```jsx
 * const dialog = useDialogStore();
 *
 * <button onClick={dialog.toggle}>Open dialog</button>
 * <Dialog store={dialog}>Content</Dialog>
 * ```
 */
export function useDialogStore(props: DialogStoreProps = {}): DialogStore {
  const [store, update] = useStore(Core.createDialogStore, props);
  return useDialogStoreProps(store, update, props);
}

export interface DialogStoreState
  extends Core.DialogStoreState, DisclosureStoreState {}

export interface DialogStoreFunctions
  extends
    Omit<Core.DialogStoreFunctions, "disclosure">,
    DisclosureStoreFunctions {}

export interface DialogStoreOptions
  extends Omit<Core.DialogStoreOptions, "disclosure">, DisclosureStoreOptions {}

export interface DialogStoreProps
  extends DialogStoreOptions, Omit<Core.DialogStoreProps, "disclosure"> {}

export interface DialogStore
  extends DialogStoreFunctions, Omit<Store<Core.DialogStore>, "disclosure"> {}
