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

import com.airlock.iam.flow.shared.application.configuration.valueprovider.RoleProviderConfig;
import com.airlock.iam.plugin.api.annotation.config.Plugin;
import com.airlock.iam.plugin.api.annotation.property.PluginListProperty;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

@Plugin(description = "Provides the roles from the configured role providers.", displayName = "Combining Role Provider")
public final class CombiningRoleProviderConfig implements RoleProviderConfig {
   @PluginListProperty(description = "Role providers whose roles will be provided.", minElements = 1, optional = false)
   private List<RoleProviderConfig> roleProviders;

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

   @SuppressFBWarnings(justification = "generated code")
   public CombiningRoleProviderConfig(List<RoleProviderConfig> roleProviders) {
      this.roleProviders = roleProviders;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public static class CombiningRoleProviderConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private ArrayList<RoleProviderConfig> roleProviders;

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

      @SuppressFBWarnings(justification = "generated code")
      public CombiningRoleProviderConfig.CombiningRoleProviderConfigBuilder roleProvider(RoleProviderConfig roleProvider) {
         if (this.roleProviders == null) {
            this.roleProviders = new ArrayList<>();
         }

         this.roleProviders.add(roleProvider);
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public CombiningRoleProviderConfig.CombiningRoleProviderConfigBuilder roleProviders(Collection<? extends RoleProviderConfig> roleProviders) {
         if (roleProviders == null) {
            throw new NullPointerException("roleProviders cannot be null");
         }

         if (this.roleProviders == null) {
            this.roleProviders = new ArrayList<>();
         }

         this.roleProviders.addAll(roleProviders);
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public CombiningRoleProviderConfig.CombiningRoleProviderConfigBuilder clearRoleProviders() {
         if (this.roleProviders != null) {
            this.roleProviders.clear();
         }

         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public CombiningRoleProviderConfig build() {
         return new CombiningRoleProviderConfig(switch (this.roleProviders == null ? 0 : this.roleProviders.size()) {
            case 0 -> Collections.emptyList();
            case 1 -> Collections.singletonList(this.roleProviders.get(0));
            default -> Collections.unmodifiableList(new ArrayList<>(this.roleProviders));
         });
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "CombiningRoleProviderConfig.CombiningRoleProviderConfigBuilder(roleProviders=" + this.roleProviders + ")";
      }
   }
}
