import { Trans } from 'react-i18next';
import { useNavigate } from 'react-router';

import { useTheme } from '@material-hu/mui/styles';

import ProfileListFieldRow from '@material-hu/components/composed-components/profile/ProfileListFieldRow';
import ProfileListUsersRow from '@material-hu/components/composed-components/profile/ProfileListUsersRow';
import ProfileSingleFieldRow from '@material-hu/components/composed-components/profile/ProfileSingleFieldRow';
import Avatar from '@material-hu/components/design-system/Avatar';
import Link from '@material-hu/components/design-system/Link';
import ListItem from '@material-hu/components/design-system/List/components/ListItem';
import Tooltip from '@material-hu/components/design-system/Tooltip';

import useFormatDate from 'src/hooks/useFormatDate';
import { getWhatsappPhoneNumberLink } from 'src/pages/dashboard/Recruiting/utils';
import { usersRoutes } from 'src/pages/dashboard/Users/routes';
import { type User } from 'src/types/user';
import { useLokaliseTranslation } from 'src/utils/i18n';
import { getFullname, getInitials } from 'src/utils/userUtils';

import {
  ProfileFieldTypes,
  type ProfileSectionField,
} from '../User/components/InformationTab/types';
import {
  getAgeKeys,
  getAnniversaryKeys,
  getAnniversaryYears,
} from '../User/components/InformationTab/utils';

type Props = {
  isUserDeactivated?: boolean;
};

export const useFieldContent = ({ isUserDeactivated }: Props = {}) => {
  const { formatDate } = useFormatDate();
  const { t } = useLokaliseTranslation('profile');
  const navigate = useNavigate();
  const theme = useTheme();

  const isDeactivated = isUserDeactivated ?? false;

  const getContent = (field: ProfileSectionField) => {
    const texts = {
      items_associated_to_field: t('items_associated_to_field', {
        field: field.name,
      }),
      no_items_found: t('no_items_found'),
      back: t('general:back'),
      items_total: (
        <Trans
          i18nKey="profile:items_total"
          values={{ count: field.value?.length ?? 0 }}
          components={{ b: <strong /> }}
        />
      ),
    };

    if (field.value == null) {
      return <ListItem text={{ title: '-', copetin: field.name }} />;
    }

    switch (field.type) {
      case ProfileFieldTypes.FACIAL_RECOGNITION:
        return (
          <Tooltip
            description={field.description}
            direction="bottom"
            disableTooltip={!field.description}
          >
            <span>
              <ProfileSingleFieldRow
                field={{
                  ...field,
                  value: field.value
                    ? t('users:facial_recognition_photo_set')
                    : t('users:facial_recognition_photo_not_set'),
                }}
                texts={texts}
              />
            </span>
          </Tooltip>
        );
      case ProfileFieldTypes.DEPARTMENT:
      case ProfileFieldTypes.JOB_POSITION:
        return (
          <ProfileSingleFieldRow
            field={{
              ...field,
              value: field.value.name,
            }}
            texts={texts}
          />
        );
      case ProfileFieldTypes.STRING:
        return (
          <Tooltip
            description={field.description}
            direction="bottom"
            disableTooltip={!field.description}
          >
            <span>
              <ProfileSingleFieldRow
                field={field}
                texts={texts}
              />
            </span>
          </Tooltip>
        );
      case ProfileFieldTypes.PHONE_NUMBER:
        return (
          <ListItem
            text={{
              title: (
                <Link
                  href={getWhatsappPhoneNumberLink(field.value)}
                  underline="hover"
                  noWrap
                >
                  {field.value}
                </Link>
              ),
              copetin: field.name,
            }}
          />
        );
      case ProfileFieldTypes.URL:
        return (
          <ListItem
            text={{
              title: (
                <Link
                  href={field.value}
                  underline="hover"
                  sx={{ display: 'block' }}
                  noWrap
                >
                  {field.value}
                </Link>
              ),
              copetin: field.name,
              withEllipsis: true,
            }}
          />
        );
      case ProfileFieldTypes.EMAIL:
        return (
          <ListItem
            text={{
              title: (
                <Link
                  href={`mailto:${field.value}`}
                  underline="hover"
                  noWrap
                >
                  {field.value}
                </Link>
              ),
              copetin: field.name,
            }}
          />
        );
      case ProfileFieldTypes.DEACTIVATION_REASON:
        return (
          <ListItem
            text={{
              title: field.value.label,
              copetin: field.name,
            }}
          />
        );
      case ProfileFieldTypes.NUMBER:
      case ProfileFieldTypes.OPTION:
        return <ListItem text={{ title: field.value, copetin: field.name }} />;
      case ProfileFieldTypes.DATE:
        return (
          <ListItem
            text={{ title: formatDate(field.value), copetin: field.name }}
          />
        );
      case ProfileFieldTypes.FULL_DATE: {
        const aniversaryDuration = getAnniversaryYears(field.value);

        // Use different keys depending on whether this is a birthdate or hiring date
        const description = field.metadata?.displayAsAge
          ? getAgeKeys(aniversaryDuration)
          : getAnniversaryKeys(aniversaryDuration);

        const anniversaryDescription =
          description.value && (field.metadata?.displayAsAge || !isDeactivated)
            ? t(description.key, {
                count: description.value,
                years: description.value,
              })
            : undefined;

        return (
          <ListItem
            text={{
              title: formatDate(field.value),
              copetin: field.name,
              description: anniversaryDescription,
            }}
          />
        );
      }
      case ProfileFieldTypes.NUMBER_LIST:
      case ProfileFieldTypes.STRING_LIST:
      case ProfileFieldTypes.MULTIPLE_OPTION:
        return (
          <ProfileListFieldRow
            field={field}
            texts={texts}
          />
        );
      case ProfileFieldTypes.USER:
      case ProfileFieldTypes.BOSS:
        return (
          <ListItem
            text={{
              title: getFullname(field.value),
              copetin: field.name,
              withEllipsis: true,
              overflow: 'tooltip',
            }}
            sideContent={
              <Avatar
                src={field.value.profilePicture}
                text={getInitials(getFullname(field.value))}
              />
            }
            slotProps={{
              container: {
                sx: {
                  width: 'fit-content',
                },
              },
              title: {
                slotProps: {
                  title: {
                    onClick: () => navigate(usersRoutes.user(field.value.id)),
                    sx: {
                      '.MuiTypography-globalS': {
                        wordBreak: 'break-all',
                        cursor: 'pointer',
                        '&:hover': {
                          color: () =>
                            theme.palette.new.action.button.text.tertiary
                              .default as string,
                          textDecoration: 'underline',
                        },
                      },
                    },
                  },
                },
              },
            }}
          />
        );
      case ProfileFieldTypes.USER_LIST: {
        const userTexts = {
          collaborator_count: t('general:collaborator_count', {
            count: field.value.length,
          }),
          back: t('general:back'),
          no_items_found: t('general:no_collaborators_found'),
          items_total: (
            <Trans
              i18nKey="profile:count_total_users"
              values={{ count: field.value.length }}
              components={{ b: <strong /> }}
            />
          ),
          drawer_title: t('users_associated_to_field', { field: field.name }),
        };
        return (
          <ProfileListUsersRow
            field={{
              ...field,
              value: field.value.map((user: User) => ({
                ...user,
                name: getFullname(user),
              })),
            }}
            texts={userTexts}
          />
        );
      }
      default:
        return field.type;
    }
  };
  return getContent;
};
