import { useMemo } from 'react';

import type { ChannelContextValue } from '../../../contexts/channelContext/ChannelContext';

export const useCreateChannelContext = ({
  channel,
  channelUnreadStateStore,
  disabled,
  enableMessageGroupingByUser,
  enforceUniqueReaction,
  error,
  hideDateSeparators,
  hideStickyDateHeader,
  highlightedMessageId,
  isChannelActive,
  loadChannelAroundMessage,
  loadChannelAtFirstUnreadMessage,
  loading,
  markRead,
  maxTimeBetweenGroupedMessages,
  maximumMessageLimit,
  members,
  read,
  reloadChannel,
  scrollToFirstUnreadThreshold,
  setChannelUnreadState,
  setTargetedMessage,
  hasPendingInitialTargetLoad,
  targetedMessage,
  threadList,
  uploadAbortControllerRef,
  watcherCount,
  watchers,
}: ChannelContextValue) => {
  const channelId = channel?.id;
  const membersLength = Object.keys(members).length;

  const readUsers = Object.values(read);
  const readUsersLength = readUsers.length;
  const readUsersLastReads = readUsers
    .map(({ last_read }) => last_read?.toISOString() ?? '')
    .join();

  const channelContext: ChannelContextValue = useMemo(
    () => ({
      channel,
      channelUnreadStateStore,
      disabled,
      enableMessageGroupingByUser,
      enforceUniqueReaction,
      error,
      hideDateSeparators,
      hideStickyDateHeader,
      highlightedMessageId,
      isChannelActive,
      loadChannelAroundMessage,
      loadChannelAtFirstUnreadMessage,
      loading,
      markRead,
      maximumMessageLimit,
      maxTimeBetweenGroupedMessages,
      members,
      read,
      reloadChannel,
      scrollToFirstUnreadThreshold,
      setChannelUnreadState,
      setTargetedMessage,
      hasPendingInitialTargetLoad,
      targetedMessage,
      threadList,
      uploadAbortControllerRef,
      watcherCount,
      watchers,
    }),
    // eslint-disable-next-line react-hooks/exhaustive-deps
    [
      channelId,
      disabled,
      error,
      isChannelActive,
      highlightedMessageId,
      loading,
      membersLength,
      readUsersLength,
      readUsersLastReads,
      targetedMessage,
      threadList,
      watcherCount,
      maximumMessageLimit,
    ],
  );

  return channelContext;
};
