package com.airlock.iam.admin.application.configuration.secretquestion;

import com.airlock.iam.admin.api.domain.model.user.AuthenticationMethods;
import com.airlock.iam.admin.domain.model.token.TokenController;
import com.airlock.iam.common.application.configuration.secretquestion.SecretQuestionsSettings;
import com.airlock.iam.core.application.configuration.store.user.UserStoreProvider;
import com.airlock.iam.plugin.api.annotation.config.Plugin;
import com.airlock.iam.plugin.api.annotation.property.PluginProperty;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;

@Plugin(description = "Token controller for Secret Questions.")
public class SecretQuestionsTokenController implements TokenController {
   @TokenController.TokenControllerId
   public static final String ID = "SECRET_QUESTIONS";
   @PluginProperty(description = "The Secret Questions settings to be used.", optional = false)
   private SecretQuestionsSettings secretQuestionsSettings;
   @PluginProperty(description = "Defines the service to be used for finding users.", optional = false, globalPluginReference = "globalUserStore")
   private UserStoreProvider userStoreProvider;

   @Override
   public AuthenticationMethods.AuthenticationMethodId getConfiguredId() {
      return AuthenticationMethods.AuthenticationMethodId.authMethodId("SECRET_QUESTIONS");
   }

   @Override
   public String getTokenControllerId() {
      return "SECRET_QUESTIONS";
   }

   public SecretQuestionsSettings getSecretQuestionsSettings() {
      return this.secretQuestionsSettings;
   }

   public UserStoreProvider getUserStoreProvider() {
      return this.userStoreProvider;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public SecretQuestionsTokenController() {
   }

   @SuppressFBWarnings(justification = "generated code")
   public SecretQuestionsTokenController(SecretQuestionsSettings secretQuestionsSettings, UserStoreProvider userStoreProvider) {
      this.secretQuestionsSettings = secretQuestionsSettings;
      this.userStoreProvider = userStoreProvider;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class SecretQuestionsTokenControllerBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private SecretQuestionsSettings secretQuestionsSettings;
      @SuppressFBWarnings(justification = "generated code")
      private UserStoreProvider userStoreProvider;

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

      @SuppressFBWarnings(justification = "generated code")
      public SecretQuestionsTokenController.SecretQuestionsTokenControllerBuilder secretQuestionsSettings(SecretQuestionsSettings secretQuestionsSettings) {
         this.secretQuestionsSettings = secretQuestionsSettings;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public SecretQuestionsTokenController.SecretQuestionsTokenControllerBuilder userStoreProvider(UserStoreProvider userStoreProvider) {
         this.userStoreProvider = userStoreProvider;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public SecretQuestionsTokenController build() {
         return new SecretQuestionsTokenController(this.secretQuestionsSettings, this.userStoreProvider);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "SecretQuestionsTokenController.SecretQuestionsTokenControllerBuilder(secretQuestionsSettings="
            + this.secretQuestionsSettings
            + ", userStoreProvider="
            + this.userStoreProvider
            + ")";
      }
   }
}
