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

import com.airlock.iam.oauth2.api.domain.model.OAuth2ClientId;
import com.airlock.iam.oauth2.api.domain.model.OAuth2Scope;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.time.Duration;
import java.util.Date;
import java.util.Set;

public final class OAuth2ClientCredentialsGrantAccessToken {
   private final OAuth2ClientId issuedTo;
   private final Date issuedAt;
   private final Date expiresAt;
   private final Set<OAuth2Scope> scopeValues;
   private final String tokenString;

   public Duration getTokenLifetime() {
      return Duration.between(this.issuedAt.toInstant(), this.expiresAt.toInstant());
   }

   @SuppressFBWarnings(justification = "generated code")
   OAuth2ClientCredentialsGrantAccessToken(OAuth2ClientId issuedTo, Date issuedAt, Date expiresAt, Set<OAuth2Scope> scopeValues, String tokenString) {
      this.issuedTo = issuedTo;
      this.issuedAt = issuedAt;
      this.expiresAt = expiresAt;
      this.scopeValues = scopeValues;
      this.tokenString = tokenString;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public OAuth2ClientId getIssuedTo() {
      return this.issuedTo;
   }

   @SuppressFBWarnings(justification = "generated code")
   public Date getIssuedAt() {
      return this.issuedAt;
   }

   @SuppressFBWarnings(justification = "generated code")
   public Date getExpiresAt() {
      return this.expiresAt;
   }

   @SuppressFBWarnings(justification = "generated code")
   public Set<OAuth2Scope> getScopeValues() {
      return this.scopeValues;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public static class OAuth2ClientCredentialsGrantAccessTokenBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private OAuth2ClientId issuedTo;
      @SuppressFBWarnings(justification = "generated code")
      private Date issuedAt;
      @SuppressFBWarnings(justification = "generated code")
      private Date expiresAt;
      @SuppressFBWarnings(justification = "generated code")
      private Set<OAuth2Scope> scopeValues;
      @SuppressFBWarnings(justification = "generated code")
      private String tokenString;

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

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2ClientCredentialsGrantAccessToken.OAuth2ClientCredentialsGrantAccessTokenBuilder issuedTo(OAuth2ClientId issuedTo) {
         this.issuedTo = issuedTo;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2ClientCredentialsGrantAccessToken.OAuth2ClientCredentialsGrantAccessTokenBuilder issuedAt(Date issuedAt) {
         this.issuedAt = issuedAt;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2ClientCredentialsGrantAccessToken.OAuth2ClientCredentialsGrantAccessTokenBuilder expiresAt(Date expiresAt) {
         this.expiresAt = expiresAt;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2ClientCredentialsGrantAccessToken.OAuth2ClientCredentialsGrantAccessTokenBuilder scopeValues(Set<OAuth2Scope> scopeValues) {
         this.scopeValues = scopeValues;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2ClientCredentialsGrantAccessToken.OAuth2ClientCredentialsGrantAccessTokenBuilder tokenString(String tokenString) {
         this.tokenString = tokenString;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2ClientCredentialsGrantAccessToken build() {
         return new OAuth2ClientCredentialsGrantAccessToken(this.issuedTo, this.issuedAt, this.expiresAt, this.scopeValues, this.tokenString);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "OAuth2ClientCredentialsGrantAccessToken.OAuth2ClientCredentialsGrantAccessTokenBuilder(issuedTo="
            + this.issuedTo
            + ", issuedAt="
            + this.issuedAt
            + ", expiresAt="
            + this.expiresAt
            + ", scopeValues="
            + this.scopeValues
            + ", tokenString="
            + this.tokenString
            + ")";
      }
   }
}
