package com.airlock.iam.base.infrastructure.validation;

import com.airlock.iam.base.misc.data.OptionalString;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

public class PatternOptionalStringValidator implements ConstraintValidator<PatternOptionalString, OptionalString> {
   private Pattern pattern;

   public void initialize(PatternOptionalString parameters) {
      PatternOptionalString.Flag[] flags = parameters.flags();
      int intFlag = 0;

      for (PatternOptionalString.Flag flag : flags) {
         intFlag |= flag.getValue();
      }

      try {
         this.pattern = Pattern.compile(parameters.regexp(), intFlag);
      } catch (PatternSyntaxException e) {
         throw e;
      }
   }

   public boolean isValid(OptionalString value, ConstraintValidatorContext constraintValidatorContext) {
      if (!value.hasValue()) {
         return true;
      }

      if (value.value() == null) {
         return true;
      }

      Matcher m = this.pattern.matcher(value.value());
      return m.matches();
   }
}
