import { useMemo } from 'react';

import Alert from '@material-hu/components/design-system/Alert';

import useFormatDate from 'src/hooks/useFormatDate';
import { useLokaliseTranslation } from 'src/utils/i18n';

import { type ApplicationResponse, ApplicationStatus } from '../../../types';
import { getRejectionType } from '../../../utils';

type HiredOrRejectedAlertProps = {
  application: ApplicationResponse;
};

export const HiredOrRejectedAlert = ({
  application,
}: HiredOrRejectedAlertProps) => {
  const { t } = useLokaliseTranslation(['ats', 'general']);
  const { formatDate } = useFormatDate();

  const currentStage = application.stages.find(
    stage => stage.id === application.currentApplicationStageId,
  );

  const title = useMemo(() => {
    if (application.status === ApplicationStatus.REJECTED) {
      return t('job_application.actions.reject.alert.title', {
        stage: currentStage?.name,
      });
    }
    return t('job_application.actions.hire.alert.title', {
      date: formatDate(currentStage?.endDate || new Date(), 'dd/MM/yyyy'),
    });
  }, [application.status, currentStage, t, formatDate]);

  const description = useMemo(() => {
    if (application.status === ApplicationStatus.REJECTED) {
      const rejectionTypeLabel = application.rejectionReasonName
        ? t(
            `common.rejection_types.${getRejectionType(application.rejectionReasonName).toLowerCase()}`,
          )
        : '';
      return `${t('job_application.actions.reject.alert.date', {
        date: formatDate(currentStage?.endDate || new Date(), 'dd/MM/yyyy'),
      })}
      ${t('general:type')}: ${rejectionTypeLabel}
      ${t('job_application.actions.reject.alert.reason', {
        reason: t(
          `common.rejection_reasons.${application.rejectionReasonName?.toLowerCase()}`,
        ),
      })}`;
    }
    return `${t('job_application.actions.hire.alert.reason', {
      reason: application?.jobOpening?.hireReasonName
        ? t(
            `common.hiring_reasons.${application?.jobOpening?.hireReasonName?.toLowerCase()}`,
          )
        : '-',
    })}
    ${t('job_application.actions.hire.alert.date', {
      date: formatDate(
        application.employeeStartDate || new Date(),
        'dd/MM/yyyy',
      ),
    })}`;
  }, [application, formatDate, currentStage, t]);

  return (
    <Alert
      severity={
        application.status === ApplicationStatus.REJECTED ? 'error' : 'success'
      }
      title={title}
      description={description}
      sx={{
        whiteSpace: 'pre-line',
      }}
    />
  );
};
