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

import com.airlock.iam.common.api.domain.model.claims.Claim;
import com.airlock.iam.oauth2.api.domain.model.OAuth2ClientId;
import com.airlock.iam.oauth2.api.domain.model.OAuth2Scope;
import com.airlock.iam.oauth2.domain.model.acr.OpenIdConnectAcrValue;
import com.airlock.iam.oauth2.domain.model.oidc.OidcUserAgentSessionId;
import com.airlock.iam.oauth2.domain.model.session.OAuth2SessionId;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import lombok.NonNull;

public final class OpenIdConnectIdTokenDataImpl implements OpenIdConnectIdTokenData {
   @NonNull
   private final String assignedTokenUser;
   @NonNull
   private final OAuth2ClientId clientId;
   @NonNull
   private final Date expiration;
   @NonNull
   private final Date userAuthenticationDate;
   @NonNull
   private final Optional<String> nonce;
   @NonNull
   private final Optional<OpenIdConnectAcrValue> acr;
   @NonNull
   private final Set<OAuth2Scope> scopes;
   @NonNull
   private final OAuth2SessionId sessionId;
   @NonNull
   private final List<Claim<?>> claims;
   @NonNull
   private final Optional<OidcUserAgentSessionId> oidcUserAgentSessionId;

   @SuppressFBWarnings(justification = "generated code")
   OpenIdConnectIdTokenDataImpl(
      @NonNull String assignedTokenUser,
      @NonNull OAuth2ClientId clientId,
      @NonNull Date expiration,
      @NonNull Date userAuthenticationDate,
      @NonNull Optional<String> nonce,
      @NonNull Optional<OpenIdConnectAcrValue> acr,
      @NonNull Set<OAuth2Scope> scopes,
      @NonNull OAuth2SessionId sessionId,
      @NonNull List<Claim<?>> claims,
      @NonNull Optional<OidcUserAgentSessionId> oidcUserAgentSessionId
   ) {
      if (assignedTokenUser == null) {
         throw new NullPointerException("assignedTokenUser is marked non-null but is null");
      }

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

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

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

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

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

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

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

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

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

      this.assignedTokenUser = assignedTokenUser;
      this.clientId = clientId;
      this.expiration = expiration;
      this.userAuthenticationDate = userAuthenticationDate;
      this.nonce = nonce;
      this.acr = acr;
      this.scopes = scopes;
      this.sessionId = sessionId;
      this.claims = claims;
      this.oidcUserAgentSessionId = oidcUserAgentSessionId;
   }

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

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

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   @Override
   public OAuth2ClientId getClientId() {
      return this.clientId;
   }

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   @Override
   public Date getExpiration() {
      return this.expiration;
   }

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   @Override
   public Date getUserAuthenticationDate() {
      return this.userAuthenticationDate;
   }

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   @Override
   public Optional<String> getNonce() {
      return this.nonce;
   }

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   @Override
   public Optional<OpenIdConnectAcrValue> getAcr() {
      return this.acr;
   }

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   @Override
   public Set<OAuth2Scope> getScopes() {
      return this.scopes;
   }

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   public OAuth2SessionId getSessionId() {
      return this.sessionId;
   }

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   @Override
   public List<Claim<?>> getClaims() {
      return this.claims;
   }

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   @Override
   public Optional<OidcUserAgentSessionId> getOidcUserAgentSessionId() {
      return this.oidcUserAgentSessionId;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class OpenIdConnectIdTokenDataImplBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private String assignedTokenUser;
      @SuppressFBWarnings(justification = "generated code")
      private OAuth2ClientId clientId;
      @SuppressFBWarnings(justification = "generated code")
      private Date expiration;
      @SuppressFBWarnings(justification = "generated code")
      private Date userAuthenticationDate;
      @SuppressFBWarnings(justification = "generated code")
      private Optional<String> nonce;
      @SuppressFBWarnings(justification = "generated code")
      private Optional<OpenIdConnectAcrValue> acr;
      @SuppressFBWarnings(justification = "generated code")
      private Set<OAuth2Scope> scopes;
      @SuppressFBWarnings(justification = "generated code")
      private OAuth2SessionId sessionId;
      @SuppressFBWarnings(justification = "generated code")
      private List<Claim<?>> claims;
      @SuppressFBWarnings(justification = "generated code")
      private Optional<OidcUserAgentSessionId> oidcUserAgentSessionId;

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

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

         this.assignedTokenUser = assignedTokenUser;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIdConnectIdTokenDataImpl.OpenIdConnectIdTokenDataImplBuilder clientId(@NonNull OAuth2ClientId clientId) {
         if (clientId == null) {
            throw new NullPointerException("clientId is marked non-null but is null");
         }

         this.clientId = clientId;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIdConnectIdTokenDataImpl.OpenIdConnectIdTokenDataImplBuilder expiration(@NonNull Date expiration) {
         if (expiration == null) {
            throw new NullPointerException("expiration is marked non-null but is null");
         }

         this.expiration = expiration;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIdConnectIdTokenDataImpl.OpenIdConnectIdTokenDataImplBuilder userAuthenticationDate(@NonNull Date userAuthenticationDate) {
         if (userAuthenticationDate == null) {
            throw new NullPointerException("userAuthenticationDate is marked non-null but is null");
         }

         this.userAuthenticationDate = userAuthenticationDate;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIdConnectIdTokenDataImpl.OpenIdConnectIdTokenDataImplBuilder nonce(@NonNull Optional<String> nonce) {
         if (nonce == null) {
            throw new NullPointerException("nonce is marked non-null but is null");
         }

         this.nonce = nonce;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIdConnectIdTokenDataImpl.OpenIdConnectIdTokenDataImplBuilder acr(@NonNull Optional<OpenIdConnectAcrValue> acr) {
         if (acr == null) {
            throw new NullPointerException("acr is marked non-null but is null");
         }

         this.acr = acr;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIdConnectIdTokenDataImpl.OpenIdConnectIdTokenDataImplBuilder scopes(@NonNull Set<OAuth2Scope> scopes) {
         if (scopes == null) {
            throw new NullPointerException("scopes is marked non-null but is null");
         }

         this.scopes = scopes;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIdConnectIdTokenDataImpl.OpenIdConnectIdTokenDataImplBuilder sessionId(@NonNull OAuth2SessionId sessionId) {
         if (sessionId == null) {
            throw new NullPointerException("sessionId is marked non-null but is null");
         }

         this.sessionId = sessionId;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIdConnectIdTokenDataImpl.OpenIdConnectIdTokenDataImplBuilder claims(@NonNull List<Claim<?>> claims) {
         if (claims == null) {
            throw new NullPointerException("claims is marked non-null but is null");
         }

         this.claims = claims;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIdConnectIdTokenDataImpl.OpenIdConnectIdTokenDataImplBuilder oidcUserAgentSessionId(
         @NonNull Optional<OidcUserAgentSessionId> oidcUserAgentSessionId
      ) {
         if (oidcUserAgentSessionId == null) {
            throw new NullPointerException("oidcUserAgentSessionId is marked non-null but is null");
         }

         this.oidcUserAgentSessionId = oidcUserAgentSessionId;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIdConnectIdTokenDataImpl build() {
         return new OpenIdConnectIdTokenDataImpl(
            this.assignedTokenUser,
            this.clientId,
            this.expiration,
            this.userAuthenticationDate,
            this.nonce,
            this.acr,
            this.scopes,
            this.sessionId,
            this.claims,
            this.oidcUserAgentSessionId
         );
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "OpenIdConnectIdTokenDataImpl.OpenIdConnectIdTokenDataImplBuilder(assignedTokenUser="
            + this.assignedTokenUser
            + ", clientId="
            + this.clientId
            + ", expiration="
            + this.expiration
            + ", userAuthenticationDate="
            + this.userAuthenticationDate
            + ", nonce="
            + this.nonce
            + ", acr="
            + this.acr
            + ", scopes="
            + this.scopes
            + ", sessionId="
            + this.sessionId
            + ", claims="
            + this.claims
            + ", oidcUserAgentSessionId="
            + this.oidcUserAgentSessionId
            + ")";
      }
   }
}
