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

import com.airlock.iam.common.application.configuration.oauth2.OAuth2ASIdentifierConfig;
import com.airlock.iam.oauth2.application.configuration.session.OAuth2SessionRepositoryConfig;
import com.airlock.iam.plugin.api.annotation.config.Plugin;
import com.airlock.iam.plugin.api.annotation.license.PluginLicenseRestriction;
import com.airlock.iam.plugin.api.annotation.property.BooleanProperty;
import com.airlock.iam.plugin.api.annotation.property.PluginProperty;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;

@Plugin(description = "Defines an authorization server with the corresponding session repository.", displayName = "Users OAuth 2.0 Authorization Server")
@PluginLicenseRestriction(moduleAffiliation = "OAuthServer")
public final class UsersOAuth2AuthorizationServerConfig {
   @PluginProperty(optional = false, description = "The authorization server identifier.")
   private OAuth2ASIdentifierConfig authorizationServerIdentifier;
   @PluginProperty(description = "OAuth 2.0 session repository config.", optional = false)
   private OAuth2SessionRepositoryConfig sessionRepository;
   @BooleanProperty(
      description = "<p>Indicates whether all persisted tokens and sessions of the user are deleted on:</p>\n<ul>\n\t<li>Password resets (setting or generating a password by admins)</li>\n\t<li>Password delete (by admins)</li>\n\t<li>Password letter orders (by admins)</li>\n</ul>",
      optional = true,
      defaultValue = "true"
   )
   private boolean deleteTokensOnPasswordChange;
   @BooleanProperty(
      description = "Indicates whether all persisted tokens and sessions of the user are deleted when the user is locked by an admin.<p><b>Note:</b> To delete tokens for users locked in the Loginapp, configure the corresponding settings within the Loginapp.</p>",
      optional = true,
      defaultValue = "true"
   )
   private boolean deleteTokensOnUserLocked;

   public OAuth2ASIdentifierConfig getAuthorizationServerIdentifier() {
      return this.authorizationServerIdentifier;
   }

   public OAuth2SessionRepositoryConfig getSessionRepository() {
      return this.sessionRepository;
   }

   public boolean isDeleteTokensOnPasswordChange() {
      return this.deleteTokensOnPasswordChange;
   }

   public boolean isDeleteTokensOnUserLocked() {
      return this.deleteTokensOnUserLocked;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public UsersOAuth2AuthorizationServerConfig(
      OAuth2ASIdentifierConfig authorizationServerIdentifier,
      OAuth2SessionRepositoryConfig sessionRepository,
      boolean deleteTokensOnPasswordChange,
      boolean deleteTokensOnUserLocked
   ) {
      this.authorizationServerIdentifier = authorizationServerIdentifier;
      this.sessionRepository = sessionRepository;
      this.deleteTokensOnPasswordChange = deleteTokensOnPasswordChange;
      this.deleteTokensOnUserLocked = deleteTokensOnUserLocked;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public static class UsersOAuth2AuthorizationServerConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private OAuth2ASIdentifierConfig authorizationServerIdentifier;
      @SuppressFBWarnings(justification = "generated code")
      private OAuth2SessionRepositoryConfig sessionRepository;
      @SuppressFBWarnings(justification = "generated code")
      private boolean deleteTokensOnPasswordChange;
      @SuppressFBWarnings(justification = "generated code")
      private boolean deleteTokensOnUserLocked;

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

      @SuppressFBWarnings(justification = "generated code")
      public UsersOAuth2AuthorizationServerConfig.UsersOAuth2AuthorizationServerConfigBuilder authorizationServerIdentifier(
         OAuth2ASIdentifierConfig authorizationServerIdentifier
      ) {
         this.authorizationServerIdentifier = authorizationServerIdentifier;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public UsersOAuth2AuthorizationServerConfig.UsersOAuth2AuthorizationServerConfigBuilder sessionRepository(OAuth2SessionRepositoryConfig sessionRepository) {
         this.sessionRepository = sessionRepository;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public UsersOAuth2AuthorizationServerConfig.UsersOAuth2AuthorizationServerConfigBuilder deleteTokensOnPasswordChange(boolean deleteTokensOnPasswordChange) {
         this.deleteTokensOnPasswordChange = deleteTokensOnPasswordChange;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public UsersOAuth2AuthorizationServerConfig.UsersOAuth2AuthorizationServerConfigBuilder deleteTokensOnUserLocked(boolean deleteTokensOnUserLocked) {
         this.deleteTokensOnUserLocked = deleteTokensOnUserLocked;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public UsersOAuth2AuthorizationServerConfig build() {
         return new UsersOAuth2AuthorizationServerConfig(
            this.authorizationServerIdentifier, this.sessionRepository, this.deleteTokensOnPasswordChange, this.deleteTokensOnUserLocked
         );
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "UsersOAuth2AuthorizationServerConfig.UsersOAuth2AuthorizationServerConfigBuilder(authorizationServerIdentifier="
            + this.authorizationServerIdentifier
            + ", sessionRepository="
            + this.sessionRepository
            + ", deleteTokensOnPasswordChange="
            + this.deleteTokensOnPasswordChange
            + ", deleteTokensOnUserLocked="
            + this.deleteTokensOnUserLocked
            + ")";
      }
   }
}
