/* global ConversationController, i18n, Whisper */

'use strict';

const attributes = {
  type: 'outgoing',
  body: 'hi',
  conversationId: 'foo',
  attachments: [],
  received_at: new Date().getTime(),
};

const source = '+14155555555';

describe('MessageCollection', () => {
  before(async () => {
    await clearDatabase();
    ConversationController.reset();
    await ConversationController.load();
  });
  after(() => {
    return clearDatabase();
  });

  it('gets outgoing contact', () => {
    const messages = new Whisper.MessageCollection();
    const message = messages.add(attributes);
    message.getContact();
  });

  it('gets incoming contact', () => {
    const messages = new Whisper.MessageCollection();
    const message = messages.add({
      type: 'incoming',
      source,
    });
    message.getContact();
  });

  it('should be ordered oldest to newest', () => {
    const messages = new Whisper.MessageCollection();
    // Timestamps
    const today = new Date();
    const tomorrow = new Date();
    tomorrow.setDate(today.getDate() + 1);

    // Add threads
    messages.add({ received_at: today });
    messages.add({ received_at: tomorrow });

    const { models } = messages;
    const firstTimestamp = models[0].get('received_at').getTime();
    const secondTimestamp = models[1].get('received_at').getTime();

    // Compare timestamps
    assert(firstTimestamp < secondTimestamp);
  });

  it('checks if is incoming message', () => {
    const messages = new Whisper.MessageCollection();
    let message = messages.add(attributes);
    assert.notOk(message.isIncoming());
    message = messages.add({ type: 'incoming' });
    assert.ok(message.isIncoming());
  });

  it('checks if is outgoing message', () => {
    const messages = new Whisper.MessageCollection();
    let message = messages.add(attributes);
    assert.ok(message.isOutgoing());
    message = messages.add({ type: 'incoming' });
    assert.notOk(message.isOutgoing());
  });

  it('checks if is group update', () => {
    const messages = new Whisper.MessageCollection();
    let message = messages.add(attributes);
    assert.notOk(message.isGroupUpdate());

    message = messages.add({ group_update: true });
    assert.ok(message.isGroupUpdate());
  });

  it('returns an accurate description', () => {
    const messages = new Whisper.MessageCollection();
    let message = messages.add(attributes);

    assert.equal(
      message.getDescription(),
      'hi',
      'If no group updates or end session flags, return message body.'
    );

    message = messages.add({ group_update: { left: 'Alice' } });
    assert.equal(
      message.getDescription(),
      'Alice left the group',
      'Notes one person leaving the group.'
    );

    message = messages.add({ group_update: { name: 'blerg' } });
    assert.equal(
      message.getDescription(),
      "Title is now 'blerg'",
      'Returns a single notice if only group_updates.name changes.'
    );

    message = messages.add({ group_update: { joined: ['Bob'] } });
    assert.equal(
      message.getDescription(),
      'Bob joined the group',
      'Returns a single notice if only group_updates.joined changes.'
    );

    message = messages.add({
      group_update: { joined: ['Bob', 'Alice', 'Eve'] },
    });
    assert.equal(
      message.getDescription(),
      'Bob, Alice, Eve joined the group',
      'Notes when >1 person joins the group.'
    );

    message = messages.add({
      group_update: { joined: ['Bob'], name: 'blerg' },
    });
    assert.equal(
      message.getDescription(),
      "Title is now 'blerg', Bob joined the group",
      'Notes when there are multiple changes to group_updates properties.'
    );

    message = messages.add({ flags: true });
    assert.equal(message.getDescription(), i18n('sessionEnded'));
  });

  it('checks if it is end of the session', () => {
    const messages = new Whisper.MessageCollection();
    let message = messages.add(attributes);
    assert.notOk(message.isEndSession());

    message = messages.add({ flags: true });
    assert.ok(message.isEndSession());
  });
});