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

import com.airlock.iam.base.api.domain.model.user.UserId;
import com.airlock.iam.oauth2.api.domain.model.AuthorizationServerId;
import com.airlock.iam.oauth2.api.domain.model.OAuth2ClientId;
import com.airlock.iam.oauth2.api.domain.model.OAuth2Scopes;
import com.airlock.iam.oauth2.domain.model.session.OAuth2SessionId;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.time.Instant;
import java.util.Optional;

public interface OAuth2Token {
   boolean isValid(Optional<OAuth2ClientId> var1, AuthorizationServerId var2);

   Optional<Instant> getExpiry();

   Optional<Long> getExpiresIn();

   Instant getGenerationInstant();

   OAuth2Scopes getScopes();

   OAuth2SessionId getSessionId();

   OAuth2Token.OAuth2TokenType getOAuth2TokenSubtype();

   OAuth2ClientId getClientId();

   AuthorizationServerId getAuthorizationServerId();

   Instant getUserAuthenticationInstant();

   int getTotalUsages();

   UserId getUserId();

   enum OAuth2TokenType {
      AUTHORIZATION_CODE("authorization code"),
      ACCESS_TOKEN("access token"),
      REFRESH_TOKEN("refresh token"),
      OPENID_CONNECT_ID_TOKEN("id token");

      private final String displayName;

      @Override
      public String toString() {
         return this.displayName;
      }

      @SuppressFBWarnings(justification = "generated code")
      OAuth2TokenType(final String displayName) {
         this.displayName = displayName;
      }

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