/**
 * @Move (SQDP)
 * Only used by the HuLibraries module - move to HuLibraries/
 */
import { PropsWithChildren, ReactElement } from 'react';

import Alert from '@material-hu/mui/Alert';

import useAuth from 'src/contexts/JWTContext';
import useFeatureFlag from 'src/hooks/useFeatureFlag';
import { FeatureFlags } from 'src/types/featureFlags';
import { useLokaliseTranslation } from 'src/utils/i18n';
import {
  CerberusUserPermissions,
  hasAllPermissions,
  hasAnyPermissions,
  UserPermissions,
} from 'src/utils/permissions';

type Props = {
  requiredPermissions: UserPermissions[];
  requireAll?: boolean;
  cerberusRequiredPermissions?: CerberusUserPermissions[];
};

const PermissionsGuard = ({
  children,
  requiredPermissions,
  requireAll = false,
  cerberusRequiredPermissions,
}: PropsWithChildren<Props>) => {
  const { permissions, instance } = useAuth();
  const { t } = useLokaliseTranslation('backoffice_only');
  const isCerberusEnabled = useFeatureFlag(FeatureFlags.CERBERUS_ENABLED);

  const permissionsToCheck =
    cerberusRequiredPermissions && isCerberusEnabled
      ? cerberusRequiredPermissions
      : requiredPermissions;

  const meetPermissions = (requireAll ? hasAllPermissions : hasAnyPermissions)(
    permissions,
    permissionsToCheck,
  );

  if (permissionsToCheck?.length && !meetPermissions) {
    return (
      <Alert
        severity="error"
        sx={{ m: 3 }}
      >
        {t('permission_guard.permission_guard')}
        <a href={`mailto:${instance?.adminEmail}`}>{instance?.adminEmail}</a>.
      </Alert>
    );
  }

  return children as ReactElement;
};

export default PermissionsGuard;
