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

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 org.apache.commons.lang3.StringUtils;

public record SessionStateId(String id) {
   public static final int SESSION_STATE_ID_LENGTH = 18;
   private static final Pattern SESSION_STATE_ID_FORMAT = Pattern.compile("[A-Za-z0-9]{%d}".formatted(18));

   public SessionStateId {
      ViolationException.checkTrue(StringUtils.isNotBlank(id), "Session state ID must not be blank");
      ViolationException.checkTrue(isValidStateRepositoryKey(id), "Invalid session state ID: " + LogUtil.logSafeString(id));
   }

   public static boolean isValidStateRepositoryKey(String id) {
      return SESSION_STATE_ID_FORMAT.matcher(id).matches();
   }

   public static SessionStateId generateStateRepositoryKey() {
      return new SessionStateId(AlphanumericRandomStringGenerator.generateAlphanumericRandomString(18));
   }
}
