package com.airlock.iam.common.domain.model.token.secretquestions;

import com.airlock.iam.core.misc.persistency.token.TokenBean;
import com.airlock.iam.core.misc.token.AbstractToken;
import com.airlock.iam.core.misc.token.KnownTokenTypes;
import java.text.ParseException;
import java.util.Date;
import java.util.Optional;

public class SecretQuestionToken extends AbstractToken {
   public SecretQuestionToken(TokenBean delegate) {
      super(delegate, KnownTokenTypes.SECRETQUESTION);
   }

   public void setAnswer(byte[] answer) {
      this.setTokenData(byteArrayToGenericDataValue(answer));
   }

   public byte[] getAnswer() {
      return byteArrayFromGenericDataValue(this.getTokenData());
   }

   public void setQuestionResourceKey(String qResourceKey) {
      this.setGenericDataElement1(qResourceKey);
   }

   public Optional<String> getQuestionResourceKey() {
      return Optional.ofNullable(this.getGenericDataElement1());
   }

   public void setTranslatedQuestion(String translatedQuestion) {
      this.setGenericDataElement2(translatedQuestion);
   }

   public Optional<String> getTranslatedQuestion() {
      return Optional.ofNullable(this.getGenericDataElement2());
   }

   public void setTranslationLangKey(String translationLangKey) {
      this.setGenericDataElement3(translationLangKey);
   }

   public Optional<String> getTranslationLangKey() {
      return Optional.ofNullable(this.getGenericDataElement3());
   }

   public void setNormalization(SecretQuestionsNormalization normalization) {
      this.setGenericDataElement4(enumToGenericDataValue(normalization));
   }

   public Optional<SecretQuestionsNormalization> getNormalization() {
      return Optional.ofNullable(enumFromGenericDataValue(this.getGenericDataElement4(), SecretQuestionsNormalization.class));
   }

   public void incrementFailedAttempts() {
      int numberOfFailedAttempts = this.getNumberOfFailedAttempts();
      this.setNumberOfFailedAttempts(++numberOfFailedAttempts);
   }

   public void resetFailedAttempts() {
      this.setNumberOfFailedAttempts(0);
   }

   public void setNumberOfFailedAttempts(int numberOfFailedAttempts) {
      this.setGenericDataElement5(integerToGenericDataValue(numberOfFailedAttempts));
   }

   public int getNumberOfFailedAttempts() {
      Integer failedAttempts = integerFromGenericDataValue(this.getGenericDataElement5());
      return failedAttempts == null ? 0 : failedAttempts;
   }

   public void setLatestSuccessfulUsageDate(Date date) {
      this.setGenericDataElement6(dateToGenericDataValue(date));
   }

   public Optional<Date> getLatestSuccessfulUsageDate() {
      try {
         return Optional.ofNullable(dateFromGenericDataValue(this.getGenericDataElement6()));
      } catch (ParseException e) {
         return Optional.empty();
      }
   }

   public void setLatestUsageDate(Date date) {
      this.handleLatestUsage(date);
   }
}
