package com.airlock.iam.admin.application.service.matrixcard;

import com.airlock.iam.admin.domain.model.token.matrixcard.MatrixCard;
import com.airlock.iam.admin.domain.model.token.matrixcard.MatrixCards;
import com.airlock.iam.base.api.domain.model.identity.Identity;
import com.airlock.iam.base.api.domain.model.user.UserId;
import com.airlock.iam.log.api.signing.SigningLogger;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.inject.Inject;

public class MatrixCardAdminService {
   private SigningLogger logger;
   private MatrixCardRepository repository;

   @Inject
   public MatrixCardAdminService(SigningLogger logger, MatrixCardRepository repository) {
      this.logger = logger;
      this.repository = repository;
   }

   public MatrixCards get(UserId userId) {
      return this.repository.get(userId);
   }

   public MatrixCards generate(UserId userId) {
      MatrixCards matrixCards = this.get(userId);
      matrixCards.generateMatrixCard().cancelOrder();
      this.save(matrixCards);
      this.logger.log("A new matrix card was generated for user '%s'", new Object[]{userId});
      return matrixCards;
   }

   public MatrixCards resetUnansweredChallenges(UserId userId) {
      MatrixCards matrixCards = this.get(userId);
      matrixCards.resetUnansweredChallenges();
      this.save(matrixCards);
      this.logger.log("Unanswered challenges for matrix card of user '%s' were reset", new Object[]{userId});
      return matrixCards;
   }

   public void delete(MatrixCardAdminService.MatrixCardDeletion deletion) {
      MatrixCards matrixCards = this.get(deletion.getUserId());
      matrixCards.removeMatrixCard(deletion.getMatrixCardId());
      if (matrixCards.getCurrentCard().isEmpty()) {
         matrixCards.order(deletion.getDeletingUser());
      }

      this.save(matrixCards);
      this.logger.log("Matrix card with ID '%s' of user '%s' was deleted", new Object[]{deletion.getMatrixCardId(), deletion.getUserId()});
   }

   public MatrixCards order(UserId userId, String orderedBy) {
      MatrixCards matrixCards = this.get(userId);
      matrixCards.order(orderedBy);
      this.save(matrixCards);
      this.logger.log("A new matrix card was ordered for user '%s'", new Object[]{userId});
      return matrixCards;
   }

   public void cancelOrder(UserId userId) {
      MatrixCards matrixCards = this.get(userId);
      matrixCards.cancelOrder();
      this.save(matrixCards);
      this.logger.log("The matrix card order for user '%s' was canceled", new Object[]{userId});
   }

   private void save(MatrixCards cards) {
      this.repository.save(cards);
   }

   @SuppressFBWarnings(justification = "generated code")
   public static MatrixCardAdminService.MatrixCardAdminServiceBuilder builder() {
      return new MatrixCardAdminService.MatrixCardAdminServiceBuilder();
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class MatrixCardAdminServiceBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private SigningLogger logger;
      @SuppressFBWarnings(justification = "generated code")
      private MatrixCardRepository repository;

      @SuppressFBWarnings(justification = "generated code")
      MatrixCardAdminServiceBuilder() {
      }

      @SuppressFBWarnings(justification = "generated code")
      public MatrixCardAdminService.MatrixCardAdminServiceBuilder logger(SigningLogger logger) {
         this.logger = logger;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public MatrixCardAdminService.MatrixCardAdminServiceBuilder repository(MatrixCardRepository repository) {
         this.repository = repository;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public MatrixCardAdminService build() {
         return new MatrixCardAdminService(this.logger, this.repository);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "MatrixCardAdminService.MatrixCardAdminServiceBuilder(logger=" + this.logger + ", repository=" + this.repository + ")";
      }
   }

   public static final class MatrixCardDeletion {
      private final UserId userId;
      private final Identity<MatrixCard> matrixCardId;
      private final String deletingUser;

      @SuppressFBWarnings(justification = "generated code")
      public static MatrixCardAdminService.MatrixCardDeletion.MatrixCardDeletionBuilder builder() {
         return new MatrixCardAdminService.MatrixCardDeletion.MatrixCardDeletionBuilder();
      }

      @SuppressFBWarnings(justification = "generated code")
      public UserId getUserId() {
         return this.userId;
      }

      @SuppressFBWarnings(justification = "generated code")
      public Identity<MatrixCard> getMatrixCardId() {
         return this.matrixCardId;
      }

      @SuppressFBWarnings(justification = "generated code")
      public String getDeletingUser() {
         return this.deletingUser;
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public boolean equals(Object o) {
         if (o == this) {
            return true;
         } else if (!(o instanceof MatrixCardAdminService.MatrixCardDeletion other)) {
            return false;
         } else {
            Object this$userId = this.userId;
            Object other$userId = other.userId;
            if (this$userId == null ? other$userId == null : this$userId.equals(other$userId)) {
               Object this$matrixCardId = this.matrixCardId;
               Object other$matrixCardId = other.matrixCardId;
               if (this$matrixCardId == null ? other$matrixCardId == null : this$matrixCardId.equals(other$matrixCardId)) {
                  Object this$deletingUser = this.deletingUser;
                  Object other$deletingUser = other.deletingUser;
                  return this$deletingUser == null ? other$deletingUser == null : this$deletingUser.equals(other$deletingUser);
               } else {
                  return false;
               }
            } else {
               return false;
            }
         }
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public int hashCode() {
         int PRIME = 59;
         int result = 1;
         Object $userId = this.userId;
         result = result * 59 + ($userId == null ? 43 : $userId.hashCode());
         Object $matrixCardId = this.matrixCardId;
         result = result * 59 + ($matrixCardId == null ? 43 : $matrixCardId.hashCode());
         Object $deletingUser = this.deletingUser;
         return result * 59 + ($deletingUser == null ? 43 : $deletingUser.hashCode());
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "MatrixCardAdminService.MatrixCardDeletion(userId="
            + this.getUserId()
            + ", matrixCardId="
            + this.getMatrixCardId()
            + ", deletingUser="
            + this.getDeletingUser()
            + ")";
      }

      @SuppressFBWarnings(justification = "generated code")
      public MatrixCardDeletion(UserId userId, Identity<MatrixCard> matrixCardId, String deletingUser) {
         this.userId = userId;
         this.matrixCardId = matrixCardId;
         this.deletingUser = deletingUser;
      }

      @SuppressFBWarnings(justification = "generated code")
      public static class MatrixCardDeletionBuilder {
         @SuppressFBWarnings(justification = "generated code")
         private UserId userId;
         @SuppressFBWarnings(justification = "generated code")
         private Identity<MatrixCard> matrixCardId;
         @SuppressFBWarnings(justification = "generated code")
         private String deletingUser;

         @SuppressFBWarnings(justification = "generated code")
         MatrixCardDeletionBuilder() {
         }

         @SuppressFBWarnings(justification = "generated code")
         public MatrixCardAdminService.MatrixCardDeletion.MatrixCardDeletionBuilder userId(UserId userId) {
            this.userId = userId;
            return this;
         }

         @SuppressFBWarnings(justification = "generated code")
         public MatrixCardAdminService.MatrixCardDeletion.MatrixCardDeletionBuilder matrixCardId(Identity<MatrixCard> matrixCardId) {
            this.matrixCardId = matrixCardId;
            return this;
         }

         @SuppressFBWarnings(justification = "generated code")
         public MatrixCardAdminService.MatrixCardDeletion.MatrixCardDeletionBuilder deletingUser(String deletingUser) {
            this.deletingUser = deletingUser;
            return this;
         }

         @SuppressFBWarnings(justification = "generated code")
         public MatrixCardAdminService.MatrixCardDeletion build() {
            return new MatrixCardAdminService.MatrixCardDeletion(this.userId, this.matrixCardId, this.deletingUser);
         }

         @SuppressFBWarnings(justification = "generated code")
         @Override
         public String toString() {
            return "MatrixCardAdminService.MatrixCardDeletion.MatrixCardDeletionBuilder(userId="
               + this.userId
               + ", matrixCardId="
               + this.matrixCardId
               + ", deletingUser="
               + this.deletingUser
               + ")";
         }
      }
   }
}
