// packages/block-library/src/list-item/hooks/use-merge.js
import { useRegistry, useDispatch, useSelect } from "@wordpress/data";
import { store as blockEditorStore } from "@wordpress/block-editor";
import { isUnmodifiedBlock, switchToBlockType } from "@wordpress/blocks";
import useOutdentListItem from "./use-outdent-list-item.mjs";
function useMerge(clientId, onMerge) {
  const registry = useRegistry();
  const {
    getPreviousBlockClientId,
    getNextBlockClientId,
    getBlockOrder,
    getBlockRootClientId,
    getBlockName,
    getBlock
  } = useSelect(blockEditorStore);
  const { mergeBlocks, moveBlocksToPosition, removeBlock, insertBlocks } = useDispatch(blockEditorStore);
  const outdentListItem = useOutdentListItem();
  function getTrailingId(id) {
    const order = getBlockOrder(id);
    if (!order.length) {
      return id;
    }
    return getTrailingId(order[order.length - 1]);
  }
  function getParentListItemId(id) {
    const listId = getBlockRootClientId(id);
    const parentListItemId = getBlockRootClientId(listId);
    if (!parentListItemId) {
      return;
    }
    if (getBlockName(parentListItemId) !== "core/list-item") {
      return;
    }
    return parentListItemId;
  }
  return (forward) => {
    function mergeWithNested(clientIdA, clientIdB) {
      registry.batch(() => {
        const [nestedListClientId] = getBlockOrder(clientIdB);
        if (nestedListClientId) {
          if (getPreviousBlockClientId(clientIdB) === clientIdA && !getBlockOrder(clientIdA).length) {
            moveBlocksToPosition(
              [nestedListClientId],
              clientIdB,
              clientIdA
            );
          } else {
            moveBlocksToPosition(
              getBlockOrder(nestedListClientId),
              nestedListClientId,
              getBlockRootClientId(clientIdA)
            );
          }
        }
        mergeBlocks(clientIdA, clientIdB);
      });
    }
    if (forward) {
      const innerListId = getBlockOrder(clientId)[0];
      let nextBlockClientId;
      let listItemId = clientId;
      if (innerListId) {
        nextBlockClientId = getBlockOrder(innerListId)[0];
      } else {
        while (!(nextBlockClientId = getNextBlockClientId(listItemId))) {
          const parentLi = getParentListItemId(listItemId);
          if (!parentLi) {
            break;
          }
          listItemId = parentLi;
        }
      }
      if (!nextBlockClientId) {
        const outerListId = getBlockRootClientId(listItemId);
        const followingBlockId = getNextBlockClientId(outerListId);
        if (followingBlockId) {
          if (getBlockName(followingBlockId) === "core/list") {
            registry.batch(() => {
              moveBlocksToPosition(
                getBlockOrder(followingBlockId),
                followingBlockId,
                outerListId
              );
              removeBlock(followingBlockId, false);
            });
          } else {
            const transformed = switchToBlockType(
              getBlock(followingBlockId),
              "core/list"
            );
            const newInnerBlocks = transformed?.[0]?.innerBlocks;
            if (newInnerBlocks?.length) {
              registry.batch(() => {
                insertBlocks(
                  newInnerBlocks,
                  void 0,
                  outerListId,
                  false
                );
                removeBlock(followingBlockId, false);
              });
            }
          }
        }
      } else if (getParentListItemId(nextBlockClientId)) {
        outdentListItem(nextBlockClientId);
      } else {
        mergeWithNested(clientId, nextBlockClientId);
      }
    } else {
      if (getParentListItemId(clientId)) {
        outdentListItem(clientId);
        return;
      }
      const previousBlockClientId = getPreviousBlockClientId(clientId);
      if (previousBlockClientId) {
        const trailingId = getTrailingId(previousBlockClientId);
        mergeWithNested(trailingId, clientId);
        return;
      }
      const blockOrder = getBlockOrder(clientId);
      if (isUnmodifiedBlock(getBlock(clientId), "content") && blockOrder.length > 0) {
        registry.batch(() => {
          outdentListItem(getBlockOrder(blockOrder[0]));
          removeBlock(clientId, true);
        });
      } else {
        onMerge(forward);
      }
    }
  };
}
export {
  useMerge as default
};
//# sourceMappingURL=use-merge.mjs.map
