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

import com.airlock.iam.oauth2.api.application.configuration.claims.CustomClaimConfig;
import com.airlock.iam.oauth2.domain.model.claims.DistributedClaims;
import com.airlock.iam.oauth2.domain.model.logoutaction.BackchannelLogoutClientSettings;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.List;
import java.util.Optional;
import lombok.NonNull;

public record OAuth2StaticClientSettings(
   @NonNull List<String> accessTokenAudience,
   @NonNull Optional<DistributedClaims> accessTokenDistributedClaims,
   @NonNull List<CustomClaimConfig> accessTokenCustomClaimConfigs,
   @NonNull Optional<DistributedClaims> idTokenDistributedClaims,
   @NonNull List<CustomClaimConfig> idTokenCustomClaims,
   @NonNull Optional<BackchannelLogoutClientSettings> backChannelLogoutSettings
) {
   @SuppressFBWarnings(justification = "generated code")
   public OAuth2StaticClientSettings {
      if (accessTokenAudience == null) {
         throw new NullPointerException("accessTokenAudience is marked non-null but is null");
      }

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

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

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

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

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

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

   @SuppressFBWarnings(justification = "generated code")
   public static class OAuth2StaticClientSettingsBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private List<String> accessTokenAudience;
      @SuppressFBWarnings(justification = "generated code")
      private Optional<DistributedClaims> accessTokenDistributedClaims;
      @SuppressFBWarnings(justification = "generated code")
      private List<CustomClaimConfig> accessTokenCustomClaimConfigs;
      @SuppressFBWarnings(justification = "generated code")
      private Optional<DistributedClaims> idTokenDistributedClaims;
      @SuppressFBWarnings(justification = "generated code")
      private List<CustomClaimConfig> idTokenCustomClaims;
      @SuppressFBWarnings(justification = "generated code")
      private Optional<BackchannelLogoutClientSettings> backChannelLogoutSettings;

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

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

         this.accessTokenAudience = accessTokenAudience;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2StaticClientSettings.OAuth2StaticClientSettingsBuilder accessTokenDistributedClaims(
         @NonNull Optional<DistributedClaims> accessTokenDistributedClaims
      ) {
         if (accessTokenDistributedClaims == null) {
            throw new NullPointerException("accessTokenDistributedClaims is marked non-null but is null");
         }

         this.accessTokenDistributedClaims = accessTokenDistributedClaims;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2StaticClientSettings.OAuth2StaticClientSettingsBuilder accessTokenCustomClaimConfigs(
         @NonNull List<CustomClaimConfig> accessTokenCustomClaimConfigs
      ) {
         if (accessTokenCustomClaimConfigs == null) {
            throw new NullPointerException("accessTokenCustomClaimConfigs is marked non-null but is null");
         }

         this.accessTokenCustomClaimConfigs = accessTokenCustomClaimConfigs;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2StaticClientSettings.OAuth2StaticClientSettingsBuilder idTokenDistributedClaims(
         @NonNull Optional<DistributedClaims> idTokenDistributedClaims
      ) {
         if (idTokenDistributedClaims == null) {
            throw new NullPointerException("idTokenDistributedClaims is marked non-null but is null");
         }

         this.idTokenDistributedClaims = idTokenDistributedClaims;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2StaticClientSettings.OAuth2StaticClientSettingsBuilder idTokenCustomClaims(@NonNull List<CustomClaimConfig> idTokenCustomClaims) {
         if (idTokenCustomClaims == null) {
            throw new NullPointerException("idTokenCustomClaims is marked non-null but is null");
         }

         this.idTokenCustomClaims = idTokenCustomClaims;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2StaticClientSettings.OAuth2StaticClientSettingsBuilder backChannelLogoutSettings(
         @NonNull Optional<BackchannelLogoutClientSettings> backChannelLogoutSettings
      ) {
         if (backChannelLogoutSettings == null) {
            throw new NullPointerException("backChannelLogoutSettings is marked non-null but is null");
         }

         this.backChannelLogoutSettings = backChannelLogoutSettings;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2StaticClientSettings build() {
         return new OAuth2StaticClientSettings(
            this.accessTokenAudience,
            this.accessTokenDistributedClaims,
            this.accessTokenCustomClaimConfigs,
            this.idTokenDistributedClaims,
            this.idTokenCustomClaims,
            this.backChannelLogoutSettings
         );
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "OAuth2StaticClientSettings.OAuth2StaticClientSettingsBuilder(accessTokenAudience="
            + this.accessTokenAudience
            + ", accessTokenDistributedClaims="
            + this.accessTokenDistributedClaims
            + ", accessTokenCustomClaimConfigs="
            + this.accessTokenCustomClaimConfigs
            + ", idTokenDistributedClaims="
            + this.idTokenDistributedClaims
            + ", idTokenCustomClaims="
            + this.idTokenCustomClaims
            + ", backChannelLogoutSettings="
            + this.backChannelLogoutSettings
            + ")";
      }
   }
}
