import { initIncomingMessage } from './dataMessage';
import { toNumber } from 'lodash';
import { ConversationController } from '../session/conversations';
import { MessageController } from '../session/messages';

export async function onError(ev: any) {
  const { error } = ev;
  window.log.error(
    'background onError:',
    window.Signal.Errors.toLogFormat(error)
  );

  if (ev.proto) {
    const envelope = ev.proto;

    const message = initIncomingMessage(envelope);

    await message.saveErrors(error || new Error('Error was null'));
    const id = message.get('conversationId');
    const conversation = await ConversationController.getInstance().getOrCreateAndWait(
      id,
      'private'
    );
    // force conversation unread count to be > 0 so it is highlighted
    conversation.set({
      active_at: Date.now(),
      unreadCount: toNumber(conversation.get('unreadCount')) + 1,
    });

    const conversationActiveAt = conversation.get('active_at');
    const messageTimestamp = message.get('timestamp') || 0;
    if (!conversationActiveAt || messageTimestamp > conversationActiveAt) {
      conversation.set({ active_at: message.get('sent_at') });
    }

    conversation.updateLastMessage();
    await conversation.notify(message);
    MessageController.getInstance().register(message.id, message);
    window.Whisper.events.trigger('messageAdded', {
      conversationKey: conversation.id,
      messageModel: message,
    });

    if (ev.confirm) {
      ev.confirm();
    }
    await conversation.commit();
  }

  throw error;
}