@Override
  public EmailMessage createDigest(
      OrcidProfile orcidProfile, Collection<Notification> notifications, Locale locale) {
    int totalMessageCount = 0;
    int orcidMessageCount = 0;
    int addActivitiesMessageCount = 0;
    int amendedMessageCount = 0;
    int activityCount = 0;
    Set<String> memberIds = new HashSet<>();
    DigestEmail digestEmail = new DigestEmail();
    for (Notification notification : notifications) {
      digestEmail.addNotification(notification);
      totalMessageCount++;
      if (notification.getSource() == null) {
        orcidMessageCount++;
      } else {
        SourceClientId clientId = notification.getSource().getSourceClientId();
        if (clientId != null) {
          memberIds.add(clientId.getPath());
        }
      }
      if (notification instanceof NotificationPermission) {
        addActivitiesMessageCount++;
        NotificationPermission permissionNotification = (NotificationPermission) notification;
        activityCount += permissionNotification.getItems().getItems().size();
        String encryptedPutCode =
            encryptionManager.encryptForExternalUse(
                String.valueOf(permissionNotification.getPutCode()));
        try {
          permissionNotification.setEncryptedPutCode(
              Base64.encodeBase64URLSafeString(encryptedPutCode.getBytes("UTF-8")));
        } catch (UnsupportedEncodingException e) {
          throw new RuntimeException(
              "Problem base 64 encoding notification put code for notification id = "
                  + permissionNotification.getPutCode(),
              e);
        }
      }
      if (notification instanceof NotificationAmended) {
        amendedMessageCount++;
      }
    }
    String emailName = notificationManager.deriveEmailFriendlyName(orcidProfile);
    String subject =
        messages.getMessage(
            "email.subject.digest",
            new String[] {emailName, String.valueOf(totalMessageCount)},
            locale);
    Map<String, Object> params = new HashMap<>();
    params.put("locale", locale);
    params.put("messages", messages);
    params.put("messageArgs", new Object[0]);
    params.put("orcidProfile", orcidProfile);
    params.put("emailName", emailName);
    params.put("digestEmail", digestEmail);
    params.put(
        "frequency", orcidProfile.getOrcidInternal().getPreferences().getSendEmailFrequencyDays());
    params.put("totalMessageCount", String.valueOf(totalMessageCount));
    params.put("orcidMessageCount", orcidMessageCount);
    params.put("addActivitiesMessageCount", addActivitiesMessageCount);
    params.put("activityCount", activityCount);
    params.put("amendedMessageCount", amendedMessageCount);
    params.put("memberIdsCount", memberIds.size());
    params.put("baseUri", orcidUrlManager.getBaseUrl());
    params.put("subject", subject);
    String bodyText = templateManager.processTemplate("digest_email.ftl", params, locale);
    String bodyHtml = templateManager.processTemplate("digest_email_html.ftl", params, locale);
    EmailMessage emailMessage = new EmailMessage();

    emailMessage.setSubject(subject);
    emailMessage.setBodyText(bodyText);
    emailMessage.setBodyHtml(bodyHtml);
    return emailMessage;
  }