package com.airlock.iam.admin.domain.model.user;

import com.airlock.iam.admin.application.configuration.users.LockingSettings;
import com.airlock.iam.admin.domain.model.token.TokenController;
import com.airlock.iam.common.application.configuration.userprofile.UserProfileItemConfig;
import com.airlock.iam.common.domain.model.permission.PermissionViolationException;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.List;

public class UserSpecificSettings {
   private final boolean editable;
   private boolean showCredentialMigrationSection;
   private boolean showUserValidSection;
   private final List<TokenController> tokenControllers;
   private final List<String> availableUserRoles;
   private final List<UserProfileItemConfig> rowsOnUserDetailPage;
   private final LockingSettings lockingSettings;
   private final boolean adminCannotDeleteSameNameUser;

   public void failIfUserNotEditable() {
      PermissionViolationException.checkTrue(this.editable, "user is not editable");
   }

   @SuppressFBWarnings(justification = "generated code")
   UserSpecificSettings(
      boolean editable,
      boolean showCredentialMigrationSection,
      boolean showUserValidSection,
      List<TokenController> tokenControllers,
      List<String> availableUserRoles,
      List<UserProfileItemConfig> rowsOnUserDetailPage,
      LockingSettings lockingSettings,
      boolean adminCannotDeleteSameNameUser
   ) {
      this.editable = editable;
      this.showCredentialMigrationSection = showCredentialMigrationSection;
      this.showUserValidSection = showUserValidSection;
      this.tokenControllers = tokenControllers;
      this.availableUserRoles = availableUserRoles;
      this.rowsOnUserDetailPage = rowsOnUserDetailPage;
      this.lockingSettings = lockingSettings;
      this.adminCannotDeleteSameNameUser = adminCannotDeleteSameNameUser;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public boolean isEditable() {
      return this.editable;
   }

   @SuppressFBWarnings(justification = "generated code")
   public boolean isShowCredentialMigrationSection() {
      return this.showCredentialMigrationSection;
   }

   @SuppressFBWarnings(justification = "generated code")
   public boolean isShowUserValidSection() {
      return this.showUserValidSection;
   }

   @SuppressFBWarnings(justification = "generated code")
   public List<TokenController> getTokenControllers() {
      return this.tokenControllers;
   }

   @SuppressFBWarnings(justification = "generated code")
   public List<String> getAvailableUserRoles() {
      return this.availableUserRoles;
   }

   @SuppressFBWarnings(justification = "generated code")
   public List<UserProfileItemConfig> getRowsOnUserDetailPage() {
      return this.rowsOnUserDetailPage;
   }

   @SuppressFBWarnings(justification = "generated code")
   public LockingSettings getLockingSettings() {
      return this.lockingSettings;
   }

   @SuppressFBWarnings(justification = "generated code")
   public boolean isAdminCannotDeleteSameNameUser() {
      return this.adminCannotDeleteSameNameUser;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class UserSpecificSettingsBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private boolean editable;
      @SuppressFBWarnings(justification = "generated code")
      private boolean showCredentialMigrationSection;
      @SuppressFBWarnings(justification = "generated code")
      private boolean showUserValidSection;
      @SuppressFBWarnings(justification = "generated code")
      private List<TokenController> tokenControllers;
      @SuppressFBWarnings(justification = "generated code")
      private List<String> availableUserRoles;
      @SuppressFBWarnings(justification = "generated code")
      private List<UserProfileItemConfig> rowsOnUserDetailPage;
      @SuppressFBWarnings(justification = "generated code")
      private LockingSettings lockingSettings;
      @SuppressFBWarnings(justification = "generated code")
      private boolean adminCannotDeleteSameNameUser;

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

      @SuppressFBWarnings(justification = "generated code")
      public UserSpecificSettings.UserSpecificSettingsBuilder editable(boolean editable) {
         this.editable = editable;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public UserSpecificSettings.UserSpecificSettingsBuilder showCredentialMigrationSection(boolean showCredentialMigrationSection) {
         this.showCredentialMigrationSection = showCredentialMigrationSection;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public UserSpecificSettings.UserSpecificSettingsBuilder showUserValidSection(boolean showUserValidSection) {
         this.showUserValidSection = showUserValidSection;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public UserSpecificSettings.UserSpecificSettingsBuilder tokenControllers(List<TokenController> tokenControllers) {
         this.tokenControllers = tokenControllers;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public UserSpecificSettings.UserSpecificSettingsBuilder availableUserRoles(List<String> availableUserRoles) {
         this.availableUserRoles = availableUserRoles;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public UserSpecificSettings.UserSpecificSettingsBuilder rowsOnUserDetailPage(List<UserProfileItemConfig> rowsOnUserDetailPage) {
         this.rowsOnUserDetailPage = rowsOnUserDetailPage;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public UserSpecificSettings.UserSpecificSettingsBuilder lockingSettings(LockingSettings lockingSettings) {
         this.lockingSettings = lockingSettings;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public UserSpecificSettings.UserSpecificSettingsBuilder adminCannotDeleteSameNameUser(boolean adminCannotDeleteSameNameUser) {
         this.adminCannotDeleteSameNameUser = adminCannotDeleteSameNameUser;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public UserSpecificSettings build() {
         return new UserSpecificSettings(
            this.editable,
            this.showCredentialMigrationSection,
            this.showUserValidSection,
            this.tokenControllers,
            this.availableUserRoles,
            this.rowsOnUserDetailPage,
            this.lockingSettings,
            this.adminCannotDeleteSameNameUser
         );
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "UserSpecificSettings.UserSpecificSettingsBuilder(editable="
            + this.editable
            + ", showCredentialMigrationSection="
            + this.showCredentialMigrationSection
            + ", showUserValidSection="
            + this.showUserValidSection
            + ", tokenControllers="
            + this.tokenControllers
            + ", availableUserRoles="
            + this.availableUserRoles
            + ", rowsOnUserDetailPage="
            + this.rowsOnUserDetailPage
            + ", lockingSettings="
            + this.lockingSettings
            + ", adminCannotDeleteSameNameUser="
            + this.adminCannotDeleteSameNameUser
            + ")";
      }
   }
}
