package com.airlock.iam.flow.shared.domain.model.newdevice;

import com.airlock.iam.base.api.domain.model.exception.FailureException;
import java.util.Optional;
import lombok.NonNull;
import org.apache.commons.codec.binary.Base64;

public record LoginFromNewDeviceEncryptionKey(@NonNull String key) {
   public static final int LENGTH = 44;

   public LoginFromNewDeviceEncryptionKey {
      if (key == null) {
         throw new NullPointerException("key is marked non-null but is null");
      }

      Optional<String> validationError = validate(key);
      if (validationError.isPresent()) {
         throw new FailureException(validationError.get());
      }
   }

   public static Optional<String> validate(String key) {
      if (key == null) {
         return Optional.of("key must not be null");
      } else if (key.length() != 44) {
         return Optional.of("key must be 44 characters");
      } else if (!Base64.isBase64(key)) {
         return Optional.of("key must be base-64 encoded");
      } else {
         return Base64.decodeBase64(key).length != 32 ? Optional.of("key must be 32 bytes") : Optional.empty();
      }
   }

   public byte[] bytes() {
      return Base64.decodeBase64(this.key);
   }

   @Override
   public String toString() {
      return "*****";
   }
}
