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

import com.airlock.iam.admin.domain.model.token.matrixcard.MatrixCards;
import com.airlock.iam.admin.domain.model.token.matrixcard.persistence.MatrixCardPersistenceConverter;
import com.airlock.iam.base.api.domain.model.store.exception.StoreFailureException;
import com.airlock.iam.base.api.domain.model.user.UserId;
import com.airlock.iam.common.api.domain.model.persistency.exception.NotFoundException;
import com.airlock.iam.common.api.domain.model.persistency.exception.PersisterException;
import com.airlock.iam.core.misc.persistency.TokenListPersister;
import com.airlock.iam.core.misc.persistency.TokenUserStructure;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.inject.Inject;
import java.util.Optional;

public class MatrixCardRepository {
   private final TokenListPersister persister;
   private final MatrixCardPersistenceConverter converter;

   @Inject
   public MatrixCardRepository(TokenListPersister persister, MatrixCardPersistenceConverter converter) {
      this.persister = persister;
      this.converter = converter;
   }

   public MatrixCards get(UserId userId) {
      Optional<TokenUserStructure> tokenStructure = this.getTokenStructure(userId);
      return tokenStructure.isPresent() ? this.converter.toMatrixCards(tokenStructure.get()) : this.converter.emptyMatrixCard(userId.getValue());
   }

   public void save(MatrixCards cards) {
      TokenUserStructure token = this.converter.toTokenUserStructure(cards);
      this.persist(token);
   }

   private void persist(TokenUserStructure token) {
      try {
         this.persister.makeTokenUserStructurePersistent(token);
      } catch (PersisterException e) {
         throw new StoreFailureException(e);
      }
   }

   private Optional<TokenUserStructure> getTokenStructure(UserId userId) {
      try {
         return Optional.ofNullable(this.persister.getTokenUserStructure(userId.getValue()));
      } catch (NotFoundException e) {
         return Optional.empty();
      } catch (PersisterException e) {
         throw new StoreFailureException(e);
      }
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public static class MatrixCardRepositoryBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private TokenListPersister persister;
      @SuppressFBWarnings(justification = "generated code")
      private MatrixCardPersistenceConverter converter;

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

      @SuppressFBWarnings(justification = "generated code")
      public MatrixCardRepository.MatrixCardRepositoryBuilder persister(TokenListPersister persister) {
         this.persister = persister;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public MatrixCardRepository.MatrixCardRepositoryBuilder converter(MatrixCardPersistenceConverter converter) {
         this.converter = converter;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public MatrixCardRepository build() {
         return new MatrixCardRepository(this.persister, this.converter);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "MatrixCardRepository.MatrixCardRepositoryBuilder(persister=" + this.persister + ", converter=" + this.converter + ")";
      }
   }
}
