import { PropsWithChildren, createContext, useContext, useMemo } from 'react';

/** Values for {@link MenuContext } */
export interface MenuContextValue {
  /**
   * Function that closes menu.
   *
   * By default, when menu is closed, focus is returned to the element that opened menu. But if
   * `skipTransitionFocus` is set to `true`, focus is not returned to the element that opened menu.
   */
  closeMenu: (skipTriggerFocus?: boolean) => void;
}

const MenuContext = createContext<MenuContextValue | undefined>(undefined);

/** Provider that provides data for whole {@link Menu } */
export function MenuContextProvider({ closeMenu, children }: PropsWithChildren<MenuContextValue>) {
  const value: MenuContextValue = useMemo(() => ({ closeMenu }), [closeMenu]);

  return <MenuContext.Provider value={value}>{children}</MenuContext.Provider>;
}

/** Returns data for whole {@link Menu } */
export function useMenuContext(): MenuContextValue {
  const value = useContext(MenuContext);
  if (!value) {
    throw new Error('useMenuContext should be used only inside MenuContextProvider');
  }

  return value;
}
