import type { ReactNode } from 'react';
import { FormattedMessage, useIntl } from 'react-intl';
import { dateFromString } from '../date-format';
import type { IReview, IUser } from '../interfaces';
import { UserInline } from '../UserInline';
import { reviewIsNew, reviewScoreClasses, reviewScoreMessages } from './helpers';

interface ReviewProps {
  review: IReview & { captain: IUser };
}

export default function Review({ review }: ReviewProps) {
  const intl = useIntl();

  const messageValues = {
    timestamp: dateFromString(review.reviewed_at),
    user: review.active_captain ? (
      <b>
        <UserInline user={review.captain} />{' '}
        <FormattedMessage
          defaultMessage='(captain)'
          description='[Reviews] Suffix on user for review listing'
        />
      </b>
    ) : (
      <>
        <UserInline user={review.captain} />
        {review.active_captain === false && (
          <>
            {' '}
            <FormattedMessage
              defaultMessage='(alumni)'
              description='[Reviews] Suffix on user for review listing'
            />
          </>
        )}
      </>
    ),
  };
  const scoreClass = reviewScoreClasses[review.score < -3 ? 0 : review.score + 3];

  return (
    <li>
      {review.score < -3 ? (
        <FormattedMessage
          defaultMessage='{user} marked as <score>not allowed</score> on {timestamp, date, long}'
          description='[Reviews] Review line for marking the map as not allowed'
          values={{
            ...messageValues,
            score: (c: ReactNode) => <span className={'review ' + scoreClass}>{c}</span>,
          }}
        />
      ) : (
        <FormattedMessage
          defaultMessage='{user} reviewed with {score} on {timestamp, date, long}'
          description='[Reviews] Review line'
          values={{
            ...messageValues,
            score: (
              <span className={'review ' + scoreClass}>
                {intl.formatMessage(reviewScoreMessages[review.score + 3])}
              </span>
            ),
          }}
        />
      )}
      {reviewIsNew(review) && (
        <span className='new'>
          {' ('}
          <FormattedMessage
            defaultMessage='New!'
            description='[Submissions] Indicator for content recently updated'
          />
          )
        </span>
      )}
      <div className={'submission-reason ' + scoreClass}>"{review.reason}"</div>
    </li>
  );
}