package com.airlock.iam.oauth2.application.configuration.accountregistration;

import com.airlock.iam.common.application.configuration.user.CustomizableIdentityGenerator;
import com.airlock.iam.core.domain.model.user.UserIdentityGenerator;
import com.airlock.iam.login.api.application.configuration.oauth2.accountregistration.AccountRegistrationUsernameProviderConfig;
import com.airlock.iam.login.api.domain.model.oauth2.accountregistration.AccountRegistrationUsernameProvider;
import com.airlock.iam.oauth2.domain.model.accountregistration.GeneratedUsernameProvider;
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.PluginProperty;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;

@Plugin(description = "Generates a username based on the configured identity generator.", displayName = "Generated Username")
@PluginLicenseRestriction(moduleAffiliation = "OAuthSocialRegistration")
public final class GeneratedUsernameConfig implements AccountRegistrationUsernameProviderConfig {
   @PluginProperty(description = "Rule to generate user names.", optional = true, defaultValue = CustomizableIdentityGenerator.class)
   private UserIdentityGenerator usernameGenerator;

   @Override
   public AccountRegistrationUsernameProvider logic() {
      return new GeneratedUsernameProvider(this.usernameGenerator);
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public GeneratedUsernameConfig(UserIdentityGenerator usernameGenerator) {
      this.usernameGenerator = usernameGenerator;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public static class GeneratedUsernameConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private UserIdentityGenerator usernameGenerator;

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

      @SuppressFBWarnings(justification = "generated code")
      public GeneratedUsernameConfig.GeneratedUsernameConfigBuilder usernameGenerator(UserIdentityGenerator usernameGenerator) {
         this.usernameGenerator = usernameGenerator;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public GeneratedUsernameConfig build() {
         return new GeneratedUsernameConfig(this.usernameGenerator);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "GeneratedUsernameConfig.GeneratedUsernameConfigBuilder(usernameGenerator=" + this.usernameGenerator + ")";
      }
   }
}
