package com.airlock.iam.common.application.query;

import com.airlock.iam.base.api.domain.model.store.query.Restriction;
import com.airlock.iam.common.application.query.restriction.RestrictionProviders;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.List;

public final class QuerySettings {
   private final RestrictionProviders restrictionProviders;
   private final List<Restriction> restrictions;
   private final boolean caseSensitivityDefault;
   private final boolean allowsCaseInsensitiveContextDataSearch;

   private QuerySettings(
      RestrictionProviders restrictionProviders, List<Restriction> restrictions, boolean caseSensitivityDefault, boolean allowsCaseInsensitiveContextDataSearch
   ) {
      this.restrictionProviders = restrictionProviders != null ? restrictionProviders : RestrictionProviders.builder().build();
      this.restrictions = restrictions;
      this.caseSensitivityDefault = caseSensitivityDefault;
      this.allowsCaseInsensitiveContextDataSearch = allowsCaseInsensitiveContextDataSearch;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public RestrictionProviders restrictionProviders() {
      return this.restrictionProviders;
   }

   @SuppressFBWarnings(justification = "generated code")
   public List<Restriction> restrictions() {
      return this.restrictions;
   }

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

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

   @SuppressFBWarnings(justification = "generated code")
   public static class QuerySettingsBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private RestrictionProviders restrictionProviders;
      @SuppressFBWarnings(justification = "generated code")
      private List<Restriction> restrictions;
      @SuppressFBWarnings(justification = "generated code")
      private boolean caseSensitivityDefault;
      @SuppressFBWarnings(justification = "generated code")
      private boolean allowsCaseInsensitiveContextDataSearch;

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

      @SuppressFBWarnings(justification = "generated code")
      public QuerySettings.QuerySettingsBuilder restrictionProviders(RestrictionProviders restrictionProviders) {
         this.restrictionProviders = restrictionProviders;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public QuerySettings.QuerySettingsBuilder restrictions(List<Restriction> restrictions) {
         this.restrictions = restrictions;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public QuerySettings.QuerySettingsBuilder caseSensitivityDefault(boolean caseSensitivityDefault) {
         this.caseSensitivityDefault = caseSensitivityDefault;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public QuerySettings.QuerySettingsBuilder allowsCaseInsensitiveContextDataSearch(boolean allowsCaseInsensitiveContextDataSearch) {
         this.allowsCaseInsensitiveContextDataSearch = allowsCaseInsensitiveContextDataSearch;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public QuerySettings build() {
         return new QuerySettings(this.restrictionProviders, this.restrictions, this.caseSensitivityDefault, this.allowsCaseInsensitiveContextDataSearch);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "QuerySettings.QuerySettingsBuilder(restrictionProviders="
            + this.restrictionProviders
            + ", restrictions="
            + this.restrictions
            + ", caseSensitivityDefault="
            + this.caseSensitivityDefault
            + ", allowsCaseInsensitiveContextDataSearch="
            + this.allowsCaseInsensitiveContextDataSearch
            + ")";
      }
   }
}
