import type { PickRequired } from "@ariakit/utils";
import type { ReactElement, ReactNode } from "react";
import { SelectContextProvider } from "./select-context.tsx";
import type { SelectStoreProps, SelectStoreValue } from "./select-store.ts";
import { useSelectStore } from "./select-store.ts";

type Value = SelectStoreValue;

/**
 * Provides a select store to [Select](https://ariakit.com/components/select)
 * components.
 * @deprecated Use
 * [`ComboboxProvider`](https://ariakit.com/reference/combobox-provider)
 * instead.
 * @see https://ariakit.com/components/select
 * @example
 * ```jsx
 * <SelectProvider defaultValue="Apple">
 *   <Select />
 *   <SelectPopover>
 *     <SelectItem value="Apple" />
 *     <SelectItem value="Banana" />
 *     <SelectItem value="Orange" />
 *   </SelectPopover>
 * </SelectProvider>
 * ```
 */

export function SelectProvider<T extends Value = Value>(
  props: PickRequired<SelectProviderProps<T>, "value" | "defaultValue">,
): ReactElement;

/** @deprecated Use `ComboboxProvider` instead. */
export function SelectProvider(props?: SelectProviderProps): ReactElement;

export function SelectProvider(props: SelectProviderProps = {}) {
  const store = useSelectStore(props);
  return (
    <SelectContextProvider value={store}>
      {props.children}
    </SelectContextProvider>
  );
}

/** @deprecated Use `ComboboxProviderProps` instead. */
export interface SelectProviderProps<
  T extends Value = Value,
> extends SelectStoreProps<T> {
  children?: ReactNode;
}
