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.common.domain.service.session.IdentityStringGenerator;
import java.util.regex.Pattern;
import org.apache.commons.lang3.StringUtils;

public record SessionId(String id) {
   public static final int MAX_SESSION_ID_LENGTH = 256;
   private static final Pattern ALLOWED_ID = Pattern.compile("[\\x21-\\x7E]{2,%d}".formatted(256));

   public SessionId {
      ViolationException.checkTrue(StringUtils.isNotBlank(id), "SessionId must not be blank");
      ViolationException.checkTrue(isValidSessionId(id), "Invalid SessionId: " + LogUtil.logSafeString(id));
   }

   public static boolean isValidSessionId(String id) {
      return ALLOWED_ID.matcher(id).matches();
   }

   public static SessionId generateSessionId() {
      return new SessionId(IdentityStringGenerator.generateIdentityString());
   }
}
