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.user.User;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.flow.api.domain.model.step.FlowCondition;
import com.airlock.iam.flow.shared.application.configuration.condition.UsernameMatchingConditionConfig;
import jakarta.inject.Inject;
import jakarta.inject.Provider;

@LogicForConfig(UsernameMatchingConditionConfig.class)
public class UsernameMatchingCondition implements FlowCondition {
   private static final ELogger LOG = ELoggerFactory.getLogger(UsernameMatchingCondition.class);
   private final UsernameMatchingConditionConfig config;
   private final Provider<User> user;

   @Inject
   public UsernameMatchingCondition(UsernameMatchingConditionConfig config, Provider<User> user) {
      this.config = config;
      this.user = user;
   }

   @Override
   public boolean isFulfilled() {
      boolean matches = ((User)this.user.get()).hasName() && this.config.getPattern().matcher(((User)this.user.get()).getName()).matches();
      if (matches) {
         LOG.debug(String.format("The regex %s matched user %s", this.config.getPattern().toString(), ((User)this.user.get()).getName()));
      }

      return matches;
   }

   @Override
   public String displayName() {
      return "User ID Matches " + LogUtil.quote(this.config.getPattern());
   }
}
