import {
	type ComboboxContentCommonProps,
	type ComboboxContentOptions,
	type ComboboxContentProps,
	type ComboboxContentRenderProps,
	ComboboxContent as Content,
} from "../combobox/combobox-content";
import {
	type ComboboxInputCommonProps,
	type ComboboxInputOptions,
	type ComboboxInputProps,
	type ComboboxInputRenderProps,
	ComboboxInput as Input,
} from "../combobox/combobox-input";
import {
	type ComboboxListboxCommonProps,
	type ComboboxListboxOptions,
	type ComboboxListboxProps,
	type ComboboxListboxRenderProps,
	ComboboxListbox as Listbox,
} from "../combobox/combobox-listbox";
import {
	type ComboboxPortalProps,
	ComboboxPortal as Portal,
} from "../combobox/combobox-portal";
import {
	type FormControlDescriptionCommonProps as ComboboxDescriptionCommonProps,
	type FormControlDescriptionOptions as ComboboxDescriptionOptions,
	type FormControlDescriptionProps as ComboboxDescriptionProps,
	type FormControlDescriptionRenderProps as ComboboxDescriptionRenderProps,
	type FormControlErrorMessageCommonProps as ComboboxErrorMessageCommonProps,
	type FormControlErrorMessageOptions as ComboboxErrorMessageOptions,
	type FormControlErrorMessageProps as ComboboxErrorMessageProps,
	type FormControlErrorMessageRenderProps as ComboboxErrorMessageRenderProps,
	type FormControlLabelCommonProps as ComboboxLabelCommonProps,
	type FormControlLabelOptions as ComboboxLabelOptions,
	type FormControlLabelProps as ComboboxLabelProps,
	type FormControlLabelRenderProps as ComboboxLabelRenderProps,
	FormControlDescription as Description,
	FormControlErrorMessage as ErrorMessage,
	FormControlLabel as Label,
} from "../form-control";
import {
	type ListboxItemCommonProps as ComboboxItemCommonProps,
	type ListboxItemDescriptionCommonProps as ComboboxItemDescriptionCommonProps,
	type ListboxItemDescriptionOptions as ComboboxItemDescriptionOptions,
	type ListboxItemDescriptionProps as ComboboxItemDescriptionProps,
	type ListboxItemDescriptionRenderProps as ComboboxItemDescriptionRenderProps,
	type ListboxItemIndicatorCommonProps as ComboboxItemIndicatorCommonProps,
	type ListboxItemIndicatorOptions as ComboboxItemIndicatorOptions,
	type ListboxItemIndicatorProps as ComboboxItemIndicatorProps,
	type ListboxItemIndicatorRenderProps as ComboboxItemIndicatorRenderProps,
	type ListboxItemLabelCommonProps as ComboboxItemLabelCommonProps,
	type ListboxItemLabelOptions as ComboboxItemLabelOptions,
	type ListboxItemLabelProps as ComboboxItemLabelProps,
	type ListboxItemLabelRenderProps as ComboboxItemLabelRenderProps,
	type ListboxItemOptions as ComboboxItemOptions,
	type ListboxItemProps as ComboboxItemProps,
	type ListboxItemRenderProps as ComboboxItemRenderProps,
	type ListboxSectionCommonProps as ComboboxSectionCommonProps,
	type ListboxSectionOptions as ComboboxSectionOptions,
	type ListboxSectionProps as ComboboxSectionProps,
	type ListboxSectionRenderProps as ComboboxSectionRenderProps,
	Item,
	ItemDescription,
	ItemIndicator,
	ItemLabel,
	Section,
} from "../listbox";
import {
	Arrow,
	type PopperArrowOptions as ComboboxArrowOptions,
	type PopperArrowProps as ComboboxArrowProps,
} from "../popper";
import type {
	ComboboxBaseItemComponentProps as ComboboxRootItemComponentProps,
	ComboboxBaseSectionComponentProps as ComboboxRootSectionComponentProps,
} from "./combobox-base";
import {
	type ComboboxControlCommonProps,
	type ComboboxControlOptions,
	type ComboboxControlProps,
	type ComboboxControlRenderProps,
	ComboboxControl as Control,
} from "./combobox-control";
import {
	type ComboboxHiddenSelectProps,
	ComboboxHiddenSelect as HiddenSelect,
} from "./combobox-hidden-select";
import { type ComboboxIconProps, ComboboxIcon as Icon } from "./combobox-icon";
import {
	type ComboboxMultipleSelectionOptions,
	type ComboboxRootCommonProps,
	type ComboboxRootOptions,
	type ComboboxRootProps,
	type ComboboxRootRenderProps,
	type ComboboxSingleSelectionOptions,
	ComboboxRoot as Root,
} from "./combobox-root";
import {
	type ComboboxTriggerCommonProps,
	type ComboboxTriggerOptions,
	type ComboboxTriggerProps,
	type ComboboxTriggerRenderProps,
	ComboboxTrigger as Trigger,
} from "./combobox-trigger";
import type { ComboboxTriggerMode } from "./types";

export type {
	ComboboxArrowOptions,
	ComboboxArrowProps,
	ComboboxContentOptions,
	ComboboxContentCommonProps,
	ComboboxContentRenderProps,
	ComboboxContentProps,
	ComboboxControlOptions,
	ComboboxControlCommonProps,
	ComboboxControlRenderProps,
	ComboboxControlProps,
	ComboboxDescriptionOptions,
	ComboboxDescriptionCommonProps,
	ComboboxDescriptionRenderProps,
	ComboboxDescriptionProps,
	ComboboxErrorMessageOptions,
	ComboboxErrorMessageCommonProps,
	ComboboxErrorMessageRenderProps,
	ComboboxErrorMessageProps,
	ComboboxHiddenSelectProps,
	ComboboxIconProps,
	ComboboxInputOptions,
	ComboboxInputCommonProps,
	ComboboxInputRenderProps,
	ComboboxInputProps,
	ComboboxItemDescriptionOptions,
	ComboboxItemDescriptionCommonProps,
	ComboboxItemDescriptionRenderProps,
	ComboboxItemDescriptionProps,
	ComboboxItemIndicatorOptions,
	ComboboxItemIndicatorCommonProps,
	ComboboxItemIndicatorRenderProps,
	ComboboxItemIndicatorProps,
	ComboboxItemLabelOptions,
	ComboboxItemLabelCommonProps,
	ComboboxItemLabelRenderProps,
	ComboboxItemLabelProps,
	ComboboxItemOptions,
	ComboboxItemCommonProps,
	ComboboxItemRenderProps,
	ComboboxItemProps,
	ComboboxLabelOptions,
	ComboboxLabelCommonProps,
	ComboboxLabelRenderProps,
	ComboboxLabelProps,
	ComboboxListboxOptions,
	ComboboxListboxCommonProps,
	ComboboxListboxRenderProps,
	ComboboxListboxProps,
	ComboboxMultipleSelectionOptions,
	ComboboxPortalProps,
	ComboboxRootItemComponentProps,
	ComboboxRootOptions,
	ComboboxRootCommonProps,
	ComboboxRootRenderProps,
	ComboboxRootProps,
	ComboboxRootSectionComponentProps,
	ComboboxSectionOptions,
	ComboboxSectionCommonProps,
	ComboboxSectionRenderProps,
	ComboboxSectionProps,
	ComboboxSingleSelectionOptions,
	ComboboxTriggerMode,
	ComboboxTriggerOptions,
	ComboboxTriggerCommonProps,
	ComboboxTriggerRenderProps,
	ComboboxTriggerProps,
};

export {
	Arrow,
	Content,
	Control,
	Description,
	ErrorMessage,
	HiddenSelect,
	Icon,
	Input,
	Item,
	ItemDescription,
	ItemIndicator,
	ItemLabel,
	Label,
	Listbox,
	Portal,
	Root,
	Section,
	Trigger,
};

export const Combobox = Object.assign(Root, {
	Arrow,
	Content,
	Control,
	Description,
	ErrorMessage,
	HiddenSelect,
	Icon,
	Input,
	Item,
	ItemDescription,
	ItemIndicator,
	ItemLabel,
	Label,
	Listbox,
	Portal,
	Section,
	Trigger,
});

/**
 * API will most probably change
 */
export {
	useComboboxContext,
	type ComboboxContextValue,
} from "./combobox-context";
