'use client';

import _extends from "@babel/runtime/helpers/esm/extends";
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
import { unstable_useForkRef as useForkRef } from '@mui/utils';
import { appendOwnerState, resolveComponentProps, mergeSlotProps } from '@mui/base/utils';
/**
 * An internal function to create a Material UI slot.
 *
 * This is an advanced version of Base UI `useSlotProps` because Material UI allows leaf component to be customized via `component` prop
 * while Base UI does not need to support leaf component customization.
 *
 * @param {string} name: name of the slot
 * @param {object} parameters
 * @returns {[Slot, slotProps]} The slot's React component and the slot's props
 *
 * Note: the returned slot's props
 * - will never contain `component` prop.
 * - might contain `as` prop.
 */
export default function useSlot(
/**
 * The slot's name. All Material UI components should have `root` slot.
 *
 * If the name is `root`, the logic behaves differently from other slots,
 * e.g. the `externalForwardedProps` are spread to `root` slot but not other slots.
 */
name, parameters) {
  var className = parameters.className,
    initialElementType = parameters.elementType,
    ownerState = parameters.ownerState,
    externalForwardedProps = parameters.externalForwardedProps,
    getSlotOwnerState = parameters.getSlotOwnerState,
    internalForwardedProps = parameters.internalForwardedProps,
    useSlotPropsParams = _objectWithoutProperties(parameters, ["className", "elementType", "ownerState", "externalForwardedProps", "getSlotOwnerState", "internalForwardedProps"]);
  var rootComponent = externalForwardedProps.component,
    _externalForwardedPro = externalForwardedProps.slots,
    slots = _externalForwardedPro === void 0 ? _defineProperty({}, name, undefined) : _externalForwardedPro,
    _externalForwardedPro2 = externalForwardedProps.slotProps,
    slotProps = _externalForwardedPro2 === void 0 ? _defineProperty({}, name, undefined) : _externalForwardedPro2,
    other = _objectWithoutProperties(externalForwardedProps, ["component", "slots", "slotProps"]);
  var elementType = slots[name] || initialElementType;

  // `slotProps[name]` can be a callback that receives the component's ownerState.
  // `resolvedComponentsProps` is always a plain object.
  var resolvedComponentsProps = resolveComponentProps(slotProps[name], ownerState);
  var _mergeSlotProps = mergeSlotProps(_extends({
      className: className
    }, useSlotPropsParams, {
      externalForwardedProps: name === 'root' ? other : undefined,
      externalSlotProps: resolvedComponentsProps
    })),
    _mergeSlotProps$props = _mergeSlotProps.props,
    slotComponent = _mergeSlotProps$props.component,
    mergedProps = _objectWithoutProperties(_mergeSlotProps$props, ["component"]),
    internalRef = _mergeSlotProps.internalRef;
  var ref = useForkRef(internalRef, resolvedComponentsProps == null ? void 0 : resolvedComponentsProps.ref, parameters.ref);
  var slotOwnerState = getSlotOwnerState ? getSlotOwnerState(mergedProps) : {};
  var finalOwnerState = _extends({}, ownerState, slotOwnerState);
  var LeafComponent = name === 'root' ? slotComponent || rootComponent : slotComponent;
  var props = appendOwnerState(elementType, _extends({}, name === 'root' && !rootComponent && !slots[name] && internalForwardedProps, name !== 'root' && !slots[name] && internalForwardedProps, mergedProps, LeafComponent && {
    as: LeafComponent
  }, {
    ref: ref
  }), finalOwnerState);
  Object.keys(slotOwnerState).forEach(function (propName) {
    delete props[propName];
  });
  return [elementType, props];
}