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

import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.regex.Pattern;
import org.apache.commons.lang3.StringUtils;

public final class RawOAuth2RandomToken implements RawOAuth2Token {
   private static final Pattern TOKEN_PATTERN = Pattern.compile("[a-zA-Z0-9_-]+~[a-zA-Z0-9_-]+");
   private final OAuth2TokenKey tokenKey;
   private final String secretTokenString;

   public static RawOAuth2RandomToken parseToken(String tokenString) {
      if (!isValidToken(tokenString)) {
         throw new IllegalArgumentException("Token string is not valid. Please call isValidToken() first.");
      }

      String tokenKey = StringUtils.substringBefore(tokenString, "~");
      String secretTokenString = StringUtils.substringAfter(tokenString, "~");
      return new RawOAuth2RandomToken(OAuth2TokenKey.tokenKey(tokenKey), secretTokenString);
   }

   public static boolean isValidToken(String tokenString) {
      return StringUtils.isNotBlank(tokenString) && TOKEN_PATTERN.matcher(tokenString).matches();
   }

   @Override
   public String toTokenString() {
      return this.tokenKey.getValue() + "~" + this.secretTokenString;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public RawOAuth2RandomToken(OAuth2TokenKey tokenKey, String secretTokenString) {
      this.tokenKey = tokenKey;
      this.secretTokenString = secretTokenString;
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public OAuth2TokenKey getTokenKey() {
      return this.tokenKey;
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public String getSecretTokenString() {
      return this.secretTokenString;
   }
}
