package com.airlock.iam.common.domain.model.session;

import com.airlock.iam.base.api.domain.model.exception.ViolationException;
import com.airlock.iam.base.misc.log.LogUtil;
import com.airlock.iam.security.util.crypto.random.AlphanumericRandomStringGenerator;
import java.util.regex.Pattern;
import lombok.NonNull;
import org.apache.commons.lang3.StringUtils;

public record SessionNonce(@NonNull String nonce) {
   public static final int NONCE_LENGTH = 64;
   private static final Pattern NONCE_FORMAT = Pattern.compile("[A-Za-z0-9]{%d}".formatted(64));

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

      ViolationException.checkTrue(StringUtils.isNotBlank(nonce), "SessionNonce must not be blank");
      ViolationException.checkTrue(isValidNonce(nonce), "Invalid SessionNonce: " + LogUtil.logSafeString(nonce));
   }

   public static boolean isValidNonce(String id) {
      return NONCE_FORMAT.matcher(id).matches();
   }

   public static SessionNonce newSessionNonce() {
      return new SessionNonce(AlphanumericRandomStringGenerator.generateAlphanumericRandomString(64));
   }
}
