import React from 'react';
import classNames from 'classnames';

import { LocalizerType } from '../../types/Util';
import { MessageBody } from './MessageBody';
import { Timestamp } from './Timestamp';

interface Props {
  text: string;
  direction: 'incoming' | 'outgoing';
  status: string;
  friendStatus: 'pending' | 'accepted' | 'declined' | 'expired';
  i18n: LocalizerType;
  isBlocked: boolean;
  timestamp: number;
  onAccept: () => void;
  onDecline: () => void;
  onDeleteConversation: () => void;
  onRetrySend: () => void;
  onBlockUser: () => void;
  onUnblockUser: () => void;
}

export class FriendRequest extends React.Component<Props> {
  public getStringId() {
    const { friendStatus } = this.props;

    switch (friendStatus) {
      case 'pending':
        return 'friendRequestPending';
      case 'accepted':
        return 'friendRequestAccepted';
      case 'declined':
        return 'friendRequestDeclined';
      case 'expired':
        return 'friendRequestExpired';
      default:
        throw new Error(`Invalid friend request status: ${friendStatus}`);
    }
  }

  public renderContents() {
    const { direction, i18n, text } = this.props;
    const id = this.getStringId();

    return (
      <div>
        <div
          className={`module-friend-request__title module-friend-request__title--${direction}`}
        >
          {i18n(id)}
        </div>
        <div dir="auto">
          <MessageBody text={text || ''} i18n={i18n} />
        </div>
      </div>
    );
  }

  public renderButtons() {
    const {
      i18n,
      friendStatus,
      direction,
      status,
      onAccept,
      onDecline,
      onDeleteConversation,
      onRetrySend,
      isBlocked,
      onBlockUser,
      onUnblockUser,
    } = this.props;

    if (direction === 'incoming') {
      if (friendStatus === 'pending') {
        return (
          <div
            className={classNames(
              'module-message__metadata',
              'module-friend-request__buttonContainer',
              `module-friend-request__buttonContainer--${direction}`
            )}
          >
            <button onClick={onAccept}>Accept</button>
            <button onClick={onDecline}>Decline</button>
          </div>
        );
      } else if (friendStatus === 'declined') {
        const blockTitle = isBlocked ? i18n('unblockUser') : i18n('blockUser');
        const blockHandler = isBlocked ? onUnblockUser : onBlockUser;

        return (
          <div
            className={classNames(
              'module-message__metadata',
              'module-friend-request__buttonContainer',
              `module-friend-request__buttonContainer--${direction}`
            )}
          >
            <button onClick={onDeleteConversation}>Delete Conversation</button>
            <button onClick={blockHandler}>{blockTitle}</button>
          </div>
        );
      }
    } else {
      // Render the retry button if we errored
      if (status === 'error' && friendStatus === 'pending') {
        return (
          <div
            className={classNames(
              'module-message__metadata',
              'module-friend-request__buttonContainer',
              `module-friend-request__buttonContainer--${direction}`
            )}
          >
            <button onClick={onRetrySend}>Retry Send</button>
          </div>
        );
      }
    }

    return null;
  }

  public renderError(isCorrectSide: boolean) {
    const { status, direction } = this.props;

    if (!isCorrectSide || status !== 'error') {
      return null;
    }

    return (
      <div className="module-message__error-container">
        <div
          className={classNames(
            'module-message__error',
            `module-message__error--${direction}`
          )}
        />
      </div>
    );
  }

  // Renders 'sending', 'read' icons
  public renderStatusIndicator() {
    const { direction, status, i18n, text, timestamp } = this.props;
    if (status === 'error') {
      return null;
    }

    const withImageNoCaption = Boolean(!text);

    return (
      <div className="module-message__metadata">
        <Timestamp
          i18n={i18n}
          timestamp={timestamp}
          extended={true}
          direction={direction}
          withImageNoCaption={withImageNoCaption}
          module="module-message__metadata__date"
        />
        <span className="module-message__metadata__spacer" />
        <div
          className={classNames(
            'module-message__metadata__status-icon',
            `module-message__metadata__status-icon--${status}`
          )}
        />
      </div>
    );
  }

  public render() {
    const { direction } = this.props;

    return (
      <div className={'loki-message-wrapper'}>
        <div
          className={classNames(
            `module-message module-message--${direction}`,
            'module-message-friend-request'
          )}
        >
          {this.renderError(direction === 'incoming')}
          <div
            className={classNames(
              'module-message__container',
              `module-message__container--${direction}`,
              'module-message-friend-request__container'
            )}
          >
            <div
              className={classNames(
                'module-message__text',
                `module-message__text--${direction}`
              )}
            >
              {this.renderContents()}
              {this.renderStatusIndicator()}
              {this.renderButtons()}
            </div>
          </div>
          {this.renderError(direction === 'outgoing')}
        </div>
      </div>
    );
  }
}