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 ApiKeySecretValue {
   static final String VALUE_PATTERN = "[0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz]{43}";
   private static final int SECRET_VALUE_LENGTH_IN_BYTES = 43;
   private final String value;

   private ApiKeySecretValue(String value) {
      if (!isValidSecretValue(value)) {
         throw new IllegalArgumentException("The value is invalid.");
      }

      this.value = value;
   }

   public static ApiKeySecretValue apiKeySecretValueFromString(String value) {
      return new ApiKeySecretValue(value);
   }

   public static Optional<ApiKeySecretValue> parseApiKeySecretValue(String value) {
      return isValidSecretValue(value) ? Optional.of(new ApiKeySecretValue(value)) : Optional.empty();
   }

   public static ApiKeySecretValue randomApiKeySecretValue() {
      return new ApiKeySecretValue(AlphanumericRandomStringGenerator.generateAlphanumericRandomString(43));
   }

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

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

   public boolean matches(ApiKeySecretValue other) {
      return SecureComparison.isEqual(this.value, other.value);
   }

   private static boolean isValidSecretValue(String valueToValidate) {
      return valueToValidate.length() == 43 && AlphanumericRandomStringGenerator.isValidAlphanumericRandomString(valueToValidate);
   }
}
