import { useMemo } from 'react';

import type { MessagesContextValue } from '../../../contexts/messagesContext/MessagesContext';

export const useCreateMessagesContext = ({
  additionalPressableProps,
  channelId,
  customMessageSwipeAction,
  deleteMessage,
  deleteReaction,
  disableTypingIndicator,
  dismissKeyboardOnMessageTouch,
  enableMessageGroupingByUser,
  enableSwipeToReply,
  FlatList,
  forceAlignMessages,
  getMessageGroupStyle,
  giphyVersion,
  handleBan,
  handleCopy,
  handleDelete,
  handleDeleteForMe,
  handleEdit,
  handleFlag,
  handleMarkUnread,
  handleMute,
  handlePinMessage,
  handleQuotedReply,
  handleReaction,
  handleRetry,
  handleThreadReply,
  handleBlockUser,
  hasCreatePoll,
  initialScrollToFirstUnreadMessage,
  isAttachmentEqual,
  isMessageAIGenerated,
  markdownRules,
  messageActions,
  messageContentOrder,
  messageOverlayTargetId,
  messageSwipeToReplyHitSlop,
  messageTextNumberOfLines,
  myMessageTheme,
  onLongPressMessage,
  onPressInMessage,
  onPressMessage,
  reactionListPosition,
  reactionListType,
  removeMessage,
  retrySendMessage,
  selectReaction,
  sendReaction,
  shouldShowUnreadUnderlay,
  supportedReactions,
  targetedMessage,
  updateMessage,
  urlPreviewType,
}: MessagesContextValue & {
  /**
   * To ensure we allow re-render, when channel is changed
   */
  channelId?: string;
}) => {
  const additionalTouchablePropsLength = Object.keys(additionalPressableProps || {}).length;
  const markdownRulesLength = Object.keys(markdownRules || {}).length;
  const messageContentOrderValue = messageContentOrder.join();
  const supportedReactionsLength = supportedReactions?.length;

  const messagesContext: MessagesContextValue = useMemo(
    () => ({
      additionalPressableProps,
      customMessageSwipeAction,
      deleteMessage,
      deleteReaction,
      disableTypingIndicator,
      dismissKeyboardOnMessageTouch,
      enableMessageGroupingByUser,
      enableSwipeToReply,
      FlatList,
      forceAlignMessages,
      getMessageGroupStyle,
      giphyVersion,
      handleBan,
      handleCopy,
      handleDelete,
      handleDeleteForMe,
      handleEdit,
      handleFlag,
      handleMarkUnread,
      handleMute,
      handlePinMessage,
      handleQuotedReply,
      handleReaction,
      handleRetry,
      handleThreadReply,
      handleBlockUser,
      hasCreatePoll,
      initialScrollToFirstUnreadMessage,
      isAttachmentEqual,
      isMessageAIGenerated,
      markdownRules,
      messageActions,
      messageContentOrder,
      messageOverlayTargetId,
      messageSwipeToReplyHitSlop,
      messageTextNumberOfLines,
      myMessageTheme,
      onLongPressMessage,
      onPressInMessage,
      onPressMessage,
      reactionListPosition,
      reactionListType,
      removeMessage,
      retrySendMessage,
      selectReaction,
      sendReaction,
      shouldShowUnreadUnderlay,
      supportedReactions,
      targetedMessage,
      updateMessage,
      urlPreviewType,
    }),
    // eslint-disable-next-line react-hooks/exhaustive-deps
    [
      additionalTouchablePropsLength,
      channelId,
      disableTypingIndicator,
      dismissKeyboardOnMessageTouch,
      initialScrollToFirstUnreadMessage,
      markdownRulesLength,
      messageContentOrderValue,
      messageOverlayTargetId,
      supportedReactionsLength,
      myMessageTheme,
      targetedMessage,
      hasCreatePoll,
    ],
  );

  return messagesContext;
};
