// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only

import type { ConversationAttributesType } from '../model-types';
import { hasExpired } from '../state/selectors/expiration';
import { isOSUnsupported } from '../state/selectors/updates';

import type { AnyToast } from '../types/Toast';
import { ToastType } from '../types/Toast';
import {
  isDirectConversation,
  isGroupV1,
  isGroupV2,
} from './whatTypeOfConversation';

const MAX_MESSAGE_BODY_LENGTH = 64 * 1024;

export function shouldShowInvalidMessageToast(
  conversationAttributes: ConversationAttributesType,
  messageText?: string
): AnyToast | undefined {
  const state = window.reduxStore.getState();
  if (hasExpired(state)) {
    if (isOSUnsupported(state)) {
      return { toastType: ToastType.UnsupportedOS };
    }
    return { toastType: ToastType.Expired };
  }

  const isValid =
    isDirectConversation(conversationAttributes) ||
    isGroupV1(conversationAttributes) ||
    isGroupV2(conversationAttributes);

  if (!isValid) {
    return { toastType: ToastType.InvalidConversation };
  }

  const { e164, serviceId } = conversationAttributes;
  if (
    isDirectConversation(conversationAttributes) &&
    ((e164 && window.storage.blocked.isBlocked(e164)) ||
      (serviceId && window.storage.blocked.isServiceIdBlocked(serviceId)))
  ) {
    return { toastType: ToastType.Blocked };
  }

  const { groupId } = conversationAttributes;
  if (
    !isDirectConversation(conversationAttributes) &&
    groupId &&
    window.storage.blocked.isGroupBlocked(groupId)
  ) {
    return { toastType: ToastType.BlockedGroup };
  }

  if (
    !isDirectConversation(conversationAttributes) &&
    conversationAttributes.left
  ) {
    return { toastType: ToastType.LeftGroup };
  }

  if (messageText && messageText.length > MAX_MESSAGE_BODY_LENGTH) {
    return { toastType: ToastType.MessageBodyTooLong };
  }

  return undefined;
}