package com.airlock.iam.oauth2.domain.model.client.communication;

import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.List;
import lombok.NonNull;

public final class ClaimRequestSettings {
   @NonNull
   private final String claim;
   @NonNull
   private final List<String> values;
   @NonNull
   private final ClaimRequestSettings.ClaimRequestRequirement requirement;
   @NonNull
   private final ClaimRequestSettings.ClaimRequestMember topLevelMember;

   @SuppressFBWarnings(justification = "generated code")
   ClaimRequestSettings(
      @NonNull String claim,
      @NonNull List<String> values,
      @NonNull ClaimRequestSettings.ClaimRequestRequirement requirement,
      @NonNull ClaimRequestSettings.ClaimRequestMember topLevelMember
   ) {
      if (claim == null) {
         throw new NullPointerException("claim is marked non-null but is null");
      }

      if (values == null) {
         throw new NullPointerException("values is marked non-null but is null");
      }

      if (requirement == null) {
         throw new NullPointerException("requirement is marked non-null but is null");
      }

      if (topLevelMember == null) {
         throw new NullPointerException("topLevelMember is marked non-null but is null");
      }

      this.claim = claim;
      this.values = values;
      this.requirement = requirement;
      this.topLevelMember = topLevelMember;
   }

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

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   public String claim() {
      return this.claim;
   }

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

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   public ClaimRequestSettings.ClaimRequestRequirement requirement() {
      return this.requirement;
   }

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   public ClaimRequestSettings.ClaimRequestMember topLevelMember() {
      return this.topLevelMember;
   }

   public enum ClaimRequestMember {
      ID_TOKEN,
      USERINFO;
   }

   public enum ClaimRequestRequirement {
      ESSENTIAL,
      VOLUNTARY;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class ClaimRequestSettingsBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private String claim;
      @SuppressFBWarnings(justification = "generated code")
      private List<String> values;
      @SuppressFBWarnings(justification = "generated code")
      private ClaimRequestSettings.ClaimRequestRequirement requirement;
      @SuppressFBWarnings(justification = "generated code")
      private ClaimRequestSettings.ClaimRequestMember topLevelMember;

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

      @SuppressFBWarnings(justification = "generated code")
      public ClaimRequestSettings.ClaimRequestSettingsBuilder claim(@NonNull String claim) {
         if (claim == null) {
            throw new NullPointerException("claim is marked non-null but is null");
         }

         this.claim = claim;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public ClaimRequestSettings.ClaimRequestSettingsBuilder values(@NonNull List<String> values) {
         if (values == null) {
            throw new NullPointerException("values is marked non-null but is null");
         }

         this.values = values;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public ClaimRequestSettings.ClaimRequestSettingsBuilder requirement(@NonNull ClaimRequestSettings.ClaimRequestRequirement requirement) {
         if (requirement == null) {
            throw new NullPointerException("requirement is marked non-null but is null");
         }

         this.requirement = requirement;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public ClaimRequestSettings.ClaimRequestSettingsBuilder topLevelMember(@NonNull ClaimRequestSettings.ClaimRequestMember topLevelMember) {
         if (topLevelMember == null) {
            throw new NullPointerException("topLevelMember is marked non-null but is null");
         }

         this.topLevelMember = topLevelMember;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public ClaimRequestSettings build() {
         return new ClaimRequestSettings(this.claim, this.values, this.requirement, this.topLevelMember);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "ClaimRequestSettings.ClaimRequestSettingsBuilder(claim="
            + this.claim
            + ", values="
            + this.values
            + ", requirement="
            + this.requirement
            + ", topLevelMember="
            + this.topLevelMember
            + ")";
      }
   }
}
