import React from 'react';
import { compact, flatten } from 'lodash';

import { Intl } from '../Intl';
import { missingCaseError } from '../../util/missingCaseError';

interface Contact {
  phoneNumber: string;
  profileName?: string;
  name?: string;
}

interface Change {
  type: 'add' | 'remove' | 'name' | 'general' | 'kicked';
  isMe: boolean;
  newName?: string;
  contacts?: Array<Contact>;
}

type Props = {
  changes: Array<Change>;
};

// This component is used to display group updates in the conversation view.
// This is a not a "notification" as the name suggests, but a message inside the conversation
export const GroupNotification = (props: Props) => {
  function renderChange(change: Change) {
    const { isMe, contacts, type, newName } = change;
    const { i18n } = window;

    const people = compact(
      flatten(
        (contacts || []).map((contact, index) => {
          const element = (
            <span
              key={`external-${contact.phoneNumber}`}
              className="module-group-notification__contact"
            >
              {contact.profileName || contact.phoneNumber}
            </span>
          );

          return [index > 0 ? ', ' : null, element];
        })
      )
    );

    switch (type) {
      case 'name':
        return `${i18n('titleIsNow', [newName || ''])}.`;
      case 'add':
        if (!contacts || !contacts.length) {
          throw new Error('Group update add is missing contacts');
        }

        const joinKey = contacts.length > 1 ? 'multipleJoinedTheGroup' : 'joinedTheGroup';

        return <Intl i18n={i18n} id={joinKey} components={[people]} />;
      case 'remove':
        if (isMe) {
          return i18n('youLeftTheGroup');
        }

        if (!contacts || !contacts.length) {
          throw new Error('Group update remove is missing contacts');
        }

        const leftKey = contacts.length > 1 ? 'multipleLeftTheGroup' : 'leftTheGroup';

        return <Intl i18n={i18n} id={leftKey} components={[people]} />;
      case 'kicked':
        if (isMe) {
          return i18n('youGotKickedFromGroup');
        }

        if (!contacts || !contacts.length) {
          throw new Error('Group update kicked is missing contacts');
        }

        const kickedKey = contacts.length > 1 ? 'multipleKickedFromTheGroup' : 'kickedFromTheGroup';

        return <Intl i18n={i18n} id={kickedKey} components={[people]} />;
      case 'general':
        return i18n('updatedTheGroup');
      default:
        throw missingCaseError(type);
    }
  }

  const { changes } = props;
  return (
    <div className="module-group-notification">
      {(changes || []).map((change, index) => (
        <div key={index} className="module-group-notification__change">
          {renderChange(change)}
        </div>
      ))}
    </div>
  );
};
