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

import com.airlock.iam.base.misc.log.LogUtil;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.oauth2.domain.model.logging.OAuth2TokenRepresentation;
import com.airlock.iam.oauth2.domain.model.token.RawOAuth2JwtAccessToken;
import com.airlock.iam.oauth2.domain.model.token.RawOAuth2RandomToken;
import com.airlock.iam.oauth2.domain.model.token.RawOAuth2Token;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Optional;

public final class RawOAuth2TokenParser {
   private static final ELogger LOG = ELoggerFactory.getLogger(RawOAuth2TokenParser.class);
   private final OAuth2TokenRepresentation tokenRepresentation;

   public Optional<RawOAuth2Token> parseRawOAuth2Token(String token) {
      if (RawOAuth2RandomToken.isValidToken(token)) {
         return Optional.of(RawOAuth2RandomToken.parseToken(token));
      }

      if (RawOAuth2JwtAccessToken.isValidToken(token)) {
         return Optional.of(RawOAuth2JwtAccessToken.parseToken(token));
      }

      LOG.debug("Cannot parse OAuth 2 token string: " + LogUtil.logSafeQuote(this.tokenRepresentation.apply(token)));
      return Optional.empty();
   }

   @SuppressFBWarnings(justification = "generated code")
   public RawOAuth2TokenParser(OAuth2TokenRepresentation tokenRepresentation) {
      this.tokenRepresentation = tokenRepresentation;
   }
}
