package com.airlock.iam.login.rest.application.configuration;

import com.airlock.iam.common.application.configuration.secretquestion.SecretQuestionsSettings;
import com.airlock.iam.flow.shared.application.configuration.devicetoken.DeviceTokenSettings;
import com.airlock.iam.plugin.api.annotation.config.Plugin;
import com.airlock.iam.plugin.api.annotation.license.PluginPropertyLicenseRestriction;
import com.airlock.iam.plugin.api.annotation.property.PluginProperty;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Optional;

@Plugin(
   description = "<p>\n\tSettings for session-less user token REST endpoints. In contrast to the \"Protected Self-Services\"\n\tthese self-services don't require an authenticated session. Instead, each request must contain authentication\n\tinformation, as defined by the \"API Access Control\" settings.\n</p>\n<p>\n\tThese REST endpoints begin with the resource path <code>/&lt;loginapp-uri&gt;/rest/protected/my/</code>.\n</p>\n",
   displayName = "User Token Settings"
)
public final class UserTokenConfig {
   @PluginProperty(
      description = "<p>\n\tConfigures the protected session-less REST endpoint used to set answers to secret questions.\n</p>\n<p>\n\tREST endpoint: <code>/&lt;loginapp-uri&gt;/rest/protected/my/secret-questions/questionId/answer</code>\n</p>\n",
      optional = true
   )
   private SecretQuestionsSettings secretQuestionsSettings;
   @PluginProperty(
      description = "<p>\n\tConfigures the protected session-less REST endpoints used to manage device tokens.\n</p>\n<p>\n\tREST endpoints: <code>/&lt;loginapp-uri&gt;/rest/protected/my/tokens/device-tokens/*</code>\n</p>\n",
      optional = true
   )
   @PluginPropertyLicenseRestriction(moduleAffiliation = "DeviceToken")
   private DeviceTokenSettings deviceRegistrationSettings;

   public Optional<SecretQuestionsSettings> getSecretQuestionsSettings() {
      return Optional.ofNullable(this.secretQuestionsSettings);
   }

   public Optional<DeviceTokenSettings> getDeviceRegistrationSettings() {
      return Optional.ofNullable(this.deviceRegistrationSettings);
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public UserTokenConfig(SecretQuestionsSettings secretQuestionsSettings, DeviceTokenSettings deviceRegistrationSettings) {
      this.secretQuestionsSettings = secretQuestionsSettings;
      this.deviceRegistrationSettings = deviceRegistrationSettings;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public static class UserTokenConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private SecretQuestionsSettings secretQuestionsSettings;
      @SuppressFBWarnings(justification = "generated code")
      private DeviceTokenSettings deviceRegistrationSettings;

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

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

      @SuppressFBWarnings(justification = "generated code")
      public UserTokenConfig.UserTokenConfigBuilder deviceRegistrationSettings(DeviceTokenSettings deviceRegistrationSettings) {
         this.deviceRegistrationSettings = deviceRegistrationSettings;
         return this;
      }

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

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "UserTokenConfig.UserTokenConfigBuilder(secretQuestionsSettings="
            + this.secretQuestionsSettings
            + ", deviceRegistrationSettings="
            + this.deviceRegistrationSettings
            + ")";
      }
   }
}
