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

import com.airlock.iam.core.misc.persistency.token.TokenBean;
import com.airlock.iam.oauth2.domain.model.session.PkceCodeChallenge;
import java.util.Optional;

public class OAuth2TokenTableAuthorizationCode extends AbstractTokenTableOAuth2Token implements OAuth2AuthorizationCode {
   protected static final String AUTHORIZATION_CODE_SUBTYPE = "authorization_code";

   public OAuth2TokenTableAuthorizationCode(TokenBean delegate) {
      super(delegate);
   }

   public static OAuth2TokenTableAuthorizationCode createOAuth2AuthorizationCode(
      TokenBean delegate, RawOAuth2TokenWithHash rawAuthzToken, AuthorizationCodeInfo authCodeInfo, SessionInfo sessionInfo, int expiresIn
   ) {
      OAuth2TokenTableAuthorizationCode token = new OAuth2TokenTableAuthorizationCode(delegate);
      token.initialize(OAuth2Token.OAuth2TokenType.AUTHORIZATION_CODE, rawAuthzToken.getTokenKey(), sessionInfo, authCodeInfo.scopes(), expiresIn);
      token.setHashedTokenSecret(rawAuthzToken.getHash());
      authCodeInfo.redirectUriFromClient().ifPresent(token::setRedirectUri);
      token.setPkceChallenge(authCodeInfo.pkceCodeChallenge());
      return token;
   }

   private void setRedirectUri(String redirectUri) {
      this.setGenericDataElement4(redirectUri);
   }

   @Override
   public Optional<String> getRedirectUri() {
      return Optional.ofNullable(this.getGenericDataElement4());
   }

   private void setPkceChallenge(Optional<PkceCodeChallenge> challenge) {
      this.setGenericDataElement10(challenge.map(PkceCodeChallenge::serialize).orElse(null));
   }

   @Override
   public Optional<PkceCodeChallenge> getPkceChallenge() {
      return Optional.ofNullable(this.getGenericDataElement10()).map(PkceCodeChallenge::fromString);
   }

   @Override
   public String getHashedTokenSecret() {
      return this.getGenericDataElement2();
   }

   private void setHashedTokenSecret(String tokenSecretHash) {
      this.setGenericDataElement2(tokenSecretHash);
   }
}
