import * as React from 'react';
import { ApplicationLauncherSeparator } from '../deprecated/components/ApplicationLauncher/ApplicationLauncherSeparator';
import { Divider } from '../components/Divider/Divider';

/**
 * This function is a helper for creating an array of renderable favorite items for the Application launcher or Select
 *
 * @param {object} items The items rendered in Select or Application aLauncher
 * @param {boolean} isGrouped Flag indicating if items are grouped
 * @param {any[]} favorites Array of ids of favorited items
 * @param {boolean} isEnterTriggersArrowDown Flag indicating if we should add isEnterTriggersArrowDown to favorited item
 */
export const createRenderableFavorites = (
  items: object,
  isGrouped: boolean,
  favorites: any[],
  isEnterTriggersArrowDown?: boolean
) => {
  if (isGrouped) {
    const favoriteItems: React.ReactNode[] = [];
    (items as React.ReactElement[]).forEach((group) => {
      if (favorites.length > 0) {
        return (
          group.props.children &&
          (group.props.children as React.ReactElement[])
            .filter((item) => favorites.includes(item.props.id))
            .map((item) => {
              if (isEnterTriggersArrowDown) {
                return favoriteItems.push(
                  React.cloneElement(item, {
                    isFavorite: true,
                    enterTriggersArrowDown: isEnterTriggersArrowDown,
                    id: `favorite-${item.props.id}`
                  })
                );
              } else {
                return favoriteItems.push(
                  React.cloneElement(item, { isFavorite: true, id: `favorite-${item.props.id}` })
                );
              }
            })
        );
      }
    });
    return favoriteItems;
  }
  return (items as React.ReactElement[])
    .filter((item) => favorites.includes(item.props.id))
    .map((item) => React.cloneElement(item, { isFavorite: true, enterTriggersArrowDown: isEnterTriggersArrowDown }));
};

/**
 * This function is a helper for extending the array of renderable favorite with the select/application launcher items to  render in the Application launcher or Select
 *
 * @param {object} items The items rendered in Select or Application aLauncher
 * @param {boolean} isGrouped Flag indicating if items are grouped
 * @param {any[]} favorites Array of ids of favorited items
 */
export const extendItemsWithFavorite = (items: object, isGrouped: boolean, favorites: any[]) => {
  if (isGrouped) {
    return (items as React.ReactElement[]).map((group) =>
      React.cloneElement(group, {
        children: React.Children.map(group.props.children as React.ReactElement[], (item) => {
          if (item.type === ApplicationLauncherSeparator || item.type === Divider) {
            return item;
          }
          return React.cloneElement(item, {
            isFavorite: favorites.some(
              (favoriteId) => favoriteId === item.props.id || `favorite-${favoriteId}` === item.props.id
            )
          });
        })
      })
    );
  }
  return (items as React.ReactElement[]).map((item) =>
    React.cloneElement(item, {
      isFavorite: favorites.some((favoriteId) => favoriteId === item.props.id)
    })
  );
};
