package com.airlock.iam.oauth2.domain.model.settings;

import com.airlock.iam.oauth2.domain.model.OAuth2RequestedResponseMode;
import com.airlock.iam.oauth2.domain.model.OAuth2ResponseMode;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.Set;

public class OAuth2SupportedResponseModes {
   private Set<OAuth2ResponseMode> authCodeFlowResponseModes;
   private Set<OAuth2ResponseMode> hybridFlowResponseModes;

   public boolean isSupportedInAuthCodeFlow(OAuth2RequestedResponseMode responseMode) {
      return responseMode.toSupportedResponseMode().map(rm -> this.authCodeFlowResponseModes.contains(rm)).orElse(false);
   }

   public boolean isSupportedInHybridFlow(OAuth2RequestedResponseMode responseMode) {
      return responseMode.toSupportedResponseMode().map(rm -> this.hybridFlowResponseModes.contains(rm)).orElse(false);
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public OAuth2SupportedResponseModes(Set<OAuth2ResponseMode> authCodeFlowResponseModes, Set<OAuth2ResponseMode> hybridFlowResponseModes) {
      this.authCodeFlowResponseModes = authCodeFlowResponseModes;
      this.hybridFlowResponseModes = hybridFlowResponseModes;
   }

   @SuppressFBWarnings(justification = "generated code")
   public Set<OAuth2ResponseMode> getAuthCodeFlowResponseModes() {
      return this.authCodeFlowResponseModes;
   }

   @SuppressFBWarnings(justification = "generated code")
   public Set<OAuth2ResponseMode> getHybridFlowResponseModes() {
      return this.hybridFlowResponseModes;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class OAuth2SupportedResponseModesBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private ArrayList<OAuth2ResponseMode> authCodeFlowResponseModes;
      @SuppressFBWarnings(justification = "generated code")
      private ArrayList<OAuth2ResponseMode> hybridFlowResponseModes;

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

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2SupportedResponseModes.OAuth2SupportedResponseModesBuilder authCodeFlowResponseMode(OAuth2ResponseMode authCodeFlowResponseMode) {
         if (this.authCodeFlowResponseModes == null) {
            this.authCodeFlowResponseModes = new ArrayList<>();
         }

         this.authCodeFlowResponseModes.add(authCodeFlowResponseMode);
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2SupportedResponseModes.OAuth2SupportedResponseModesBuilder authCodeFlowResponseModes(
         Collection<? extends OAuth2ResponseMode> authCodeFlowResponseModes
      ) {
         if (authCodeFlowResponseModes == null) {
            throw new NullPointerException("authCodeFlowResponseModes cannot be null");
         }

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

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

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2SupportedResponseModes.OAuth2SupportedResponseModesBuilder clearAuthCodeFlowResponseModes() {
         if (this.authCodeFlowResponseModes != null) {
            this.authCodeFlowResponseModes.clear();
         }

         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2SupportedResponseModes.OAuth2SupportedResponseModesBuilder hybridFlowResponseMode(OAuth2ResponseMode hybridFlowResponseMode) {
         if (this.hybridFlowResponseModes == null) {
            this.hybridFlowResponseModes = new ArrayList<>();
         }

         this.hybridFlowResponseModes.add(hybridFlowResponseMode);
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2SupportedResponseModes.OAuth2SupportedResponseModesBuilder hybridFlowResponseModes(
         Collection<? extends OAuth2ResponseMode> hybridFlowResponseModes
      ) {
         if (hybridFlowResponseModes == null) {
            throw new NullPointerException("hybridFlowResponseModes cannot be null");
         }

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

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

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2SupportedResponseModes.OAuth2SupportedResponseModesBuilder clearHybridFlowResponseModes() {
         if (this.hybridFlowResponseModes != null) {
            this.hybridFlowResponseModes.clear();
         }

         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2SupportedResponseModes build() {
         Set var3 = switch (this.authCodeFlowResponseModes == null ? 0 : this.authCodeFlowResponseModes.size()) {
            case 0 -> Collections.emptySet();
            case 1 -> Collections.singleton(this.authCodeFlowResponseModes.get(0));
            default -> {
               Set<OAuth2ResponseMode> authCodeFlowResponseModes = new LinkedHashSet<>(
                  this.authCodeFlowResponseModes.size() < 1073741824
                     ? 1 + this.authCodeFlowResponseModes.size() + (this.authCodeFlowResponseModes.size() - 3) / 3
                     : Integer.MAX_VALUE
               );
               authCodeFlowResponseModes.addAll(this.authCodeFlowResponseModes);
               yield Collections.unmodifiableSet(authCodeFlowResponseModes);
            }
         };

         return new OAuth2SupportedResponseModes(
            var3,
            switch (this.hybridFlowResponseModes == null ? 0 : this.hybridFlowResponseModes.size()) {
               case 0 -> Collections.emptySet();
               case 1 -> Collections.singleton(this.hybridFlowResponseModes.get(0));
               default -> {
                  Set<OAuth2ResponseMode> hybridFlowResponseModes = new LinkedHashSet<>(
                     this.hybridFlowResponseModes.size() < 1073741824
                        ? 1 + this.hybridFlowResponseModes.size() + (this.hybridFlowResponseModes.size() - 3) / 3
                        : Integer.MAX_VALUE
                  );
                  hybridFlowResponseModes.addAll(this.hybridFlowResponseModes);
                  yield Collections.unmodifiableSet(hybridFlowResponseModes);
               }
            }
         );
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "OAuth2SupportedResponseModes.OAuth2SupportedResponseModesBuilder(authCodeFlowResponseModes="
            + this.authCodeFlowResponseModes
            + ", hybridFlowResponseModes="
            + this.hybridFlowResponseModes
            + ")";
      }
   }
}
