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

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.base.misc.log.LogUtil;
import com.airlock.iam.common.api.domain.model.valueprovider.ValueProvider;
import com.airlock.iam.flow.api.domain.model.step.FlowCondition;
import com.airlock.iam.flow.shared.application.configuration.condition.StringRegexConditionConfig;
import jakarta.inject.Inject;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@LogicForConfig(StringRegexConditionConfig.class)
public final class StringRegexCondition implements FlowCondition {
   private final StringRegexConditionConfig config;
   private final ValueProvider<String> valueProvider;

   @Inject
   public StringRegexCondition(StringRegexConditionConfig config, ValueProvider<String> valueProvider) {
      this.config = config;
      this.valueProvider = valueProvider;
   }

   @Override
   public boolean isFulfilled() {
      String providedValue = this.valueProvider.getValue();
      if (providedValue == null) {
         return this.config.isFulfilledIfValueIsNull();
      }

      Pattern pattern = this.config.getRegexPattern();
      Matcher matcher = pattern.matcher(providedValue);
      return matcher.matches();
   }

   @Override
   public String displayName() {
      return "Provided string value matches pattern " + LogUtil.quote(this.config.getRegexPattern());
   }
}
