package com.airlock.iam.publicselfservice.domain.service;

import com.airlock.iam.base.api.domain.model.user.UserId;
import com.airlock.iam.common.domain.model.token.secretquestions.SecretQuestion;
import com.airlock.iam.publicselfservice.domain.model.step.SecretQuestionsIdentityVerificationStepSettings;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;

public class SecretQuestionSimulationService {
   private final SecretQuestionsIdentityVerificationStepSettings settings;

   public SecretQuestionSimulationService(SecretQuestionsIdentityVerificationStepSettings settings) {
      this.settings = settings;
   }

   @SuppressFBWarnings(value = "PREDICTABLE_RANDOM", justification = "Random solely used once for unpredictable but deterministic ordering based on username.")
   public List<SecretQuestion> getPseudoRandomQuestions(UserId userId) {
      int seed = userId.getValue().hashCode();
      Random pseudoRandom = new Random(seed);
      List<SecretQuestion> allPossibleQuestions = this.getAllPossibleQuestions();
      Collections.shuffle(allPossibleQuestions, pseudoRandom);
      return this.trimQuestions(allPossibleQuestions);
   }

   private List<SecretQuestion> trimQuestions(List<SecretQuestion> secretQuestions) {
      return secretQuestions.subList(0, this.settings.getNumberOfRequiredQuestions());
   }

   private List<SecretQuestion> getAllPossibleQuestions() {
      return this.settings.getQuestionResourceKeys().stream().map(this::secretQuestionWithKey).collect(Collectors.toList());
   }

   private SecretQuestion secretQuestionWithKey(String key) {
      return SecretQuestion.builder().isValid(true).questionResourceKey(key).build();
   }
}
