content: package com.nonononoki.alovoa.model;
  
  import com.nonononoki.alovoa.component.TextEncryptorConverter;
  import com.nonononoki.alovoa.entity.User;
  import com.nonononoki.alovoa.entity.user.UserDonation;
  import com.nonononoki.alovoa.service.UserService;
  import lombok.Data;
  import lombok.Getter;
  import lombok.Setter;
  
  import javax.crypto.BadPaddingException;
  import javax.crypto.IllegalBlockSizeException;
  import javax.crypto.NoSuchPaddingException;
  import java.io.UnsupportedEncodingException;
  import java.security.InvalidAlgorithmParameterException;
  import java.security.InvalidKeyException;
  import java.security.NoSuchAlgorithmException;
  import java.util.ArrayList;
  import java.util.Date;
  import java.util.List;
  
  @Getter
  @Setter
  public class DonationDto {
  
      private long id;
      private Date date;
      private UserDto user;
      private double amount;
  
      public static DonationDto donationToDto(UserDonation d, User currentUser, UserService userService
              , TextEncryptorConverter textEncryptor, boolean ignoreIntention)
              throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException, NoSuchAlgorithmException,
              NoSuchPaddingException, InvalidAlgorithmParameterException, UnsupportedEncodingException, AlovoaException {
          DonationDto dto = new DonationDto();
          dto.setId(d.getId());
          dto.setDate(d.getDate());
          dto.setAmount(d.getAmount());
          dto.setUser(UserDto.userToUserDto(UserDto.DtoBuilder.builder().ignoreIntention(ignoreIntention)
                  .currentUser(currentUser).user(d.getUser()).userService(userService).build()));
          return dto;
      }
  
      public static DonationDto donationToDto(UserDonation d, User currentUser, UserService userService, TextEncryptorConverter textEncryptor,
                                              int mode, boolean ignoreIntention)
              throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException, NoSuchAlgorithmException,
              NoSuchPaddingException, InvalidAlgorithmParameterException, UnsupportedEncodingException, AlovoaException {
          DonationDto dto = new DonationDto();
          dto.setId(d.getId());
          dto.setDate(d.getDate());
          dto.setAmount(d.getAmount());
  
          dto.setUser(UserDto.userToUserDto(UserDto.DtoBuilder.builder().ignoreIntention(ignoreIntention)
                  .currentUser(currentUser).user(d.getUser()).userService(userService).build()));
          return dto;
      }
  
      public static DonationDto userToDto(User user, User currentUser, UserService userService,
                                          TextEncryptorConverter textEncryptor, boolean ignoreIntention)
              throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException, NoSuchAlgorithmException,
              NoSuchPaddingException, InvalidAlgorithmParameterException, UnsupportedEncodingException, AlovoaException {
          DonationDto dto = new DonationDto();
          dto.setId(user.getId());
          dto.setAmount(user.getTotalDonations());
          dto.setUser(UserDto.userToUserDto(UserDto.DtoBuilder.builder().ignoreIntention(ignoreIntention)
                  .currentUser(currentUser).user(user).userService(userService).build()));
          return dto;
      }
  
      public static List<DonationDto> donationsToDtos(List<UserDonation> donations, User currentUser, UserService userService,
                                                      TextEncryptorConverter textEncryptor, int maxEntries, boolean ignoreIntention) {
          return donations.subList(0, Math.min(donations.size(), maxEntries)).stream().map(donation -> {
              try {
                  return DonationDto.donationToDto(donation, currentUser, userService, textEncryptor, ignoreIntention);
              } catch (InvalidKeyException | IllegalBlockSizeException | BadPaddingException | NoSuchAlgorithmException |
                       NoSuchPaddingException | InvalidAlgorithmParameterException | UnsupportedEncodingException |
                       AlovoaException e) {
                  throw new RuntimeException(e);
              }
          }).toList();
      }
  
      public static List<DonationDto> usersToDtos(List<User> users, User currentUser, UserService userService,
                                                  TextEncryptorConverter textEncryptor, int maxEntries, boolean ignoreIntention) {
          return users.subList(0, Math.min(users.size(), maxEntries)).stream().map(user -> {
              try {
                  return DonationDto.userToDto(user, currentUser, userService, textEncryptor, ignoreIntention);
              } catch (InvalidKeyException | IllegalBlockSizeException | BadPaddingException | NoSuchAlgorithmException |
                       NoSuchPaddingException | InvalidAlgorithmParameterException | UnsupportedEncodingException |
                       AlovoaException e) {
                  throw new RuntimeException(e);
              }
          }).toList();
      }
  }
  