package com.airlock.iam.techclient.domain.model.apikey;

import com.airlock.iam.security.util.SecureComparison;
import com.airlock.iam.security.util.crypto.random.AlphanumericRandomStringGenerator;
import java.util.Optional;

public final class ApiKeySecretFingerprint {
   static final String FINGERPRINT_PATTERN = "[0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz]{21}";
   private static final int FINGERPRINT_VALUE_LENGTH_IN_BYTES = 21;
   private final String fingerprint;

   private ApiKeySecretFingerprint(String fingerprint) {
      if (!isValidFingerprint(fingerprint)) {
         throw new IllegalArgumentException("The fingerprint is invalid.");
      }

      this.fingerprint = fingerprint;
   }

   public static ApiKeySecretFingerprint apiKeySecretFingerprintFromString(String fingerprint) {
      return new ApiKeySecretFingerprint(fingerprint);
   }

   public static Optional<ApiKeySecretFingerprint> parseApiKeySecretFingerprint(String fingerprint) {
      return isValidFingerprint(fingerprint) ? Optional.of(new ApiKeySecretFingerprint(fingerprint)) : Optional.empty();
   }

   public static ApiKeySecretFingerprint randomApiKeySecretFingerprint() {
      return apiKeySecretFingerprintFromString(AlphanumericRandomStringGenerator.generateAlphanumericRandomString(21));
   }

   public String asString() {
      return this.fingerprint;
   }

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

   public boolean matches(ApiKeySecretFingerprint other) {
      return SecureComparison.isEqual(this.fingerprint, other.fingerprint);
   }

   private static boolean isValidFingerprint(String fingerprintToValidate) {
      return fingerprintToValidate.length() == 21 && AlphanumericRandomStringGenerator.isValidAlphanumericRandomString(fingerprintToValidate);
   }
}
