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

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.common.domain.model.user.PrincipalInfo;
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.UserIdentifiedConditionConfig;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.inject.Inject;
import jakarta.inject.Provider;

@LogicForConfig(UserIdentifiedConditionConfig.class)
public final class UserIdentifiedCondition implements FlowCondition {
   private static final ELogger LOG = ELoggerFactory.getLogger(UserIdentifiedCondition.class);
   private final Provider<PrincipalInfo> principalInfo;

   @Inject
   public UserIdentifiedCondition(Provider<PrincipalInfo> principalInfo) {
      this.principalInfo = principalInfo;
   }

   @Override
   public boolean isFulfilled() {
      boolean matches = ((PrincipalInfo)this.principalInfo.get()).getKnownIdentity().isPresent();
      if (matches) {
         LOG.debug(String.format("User %s has been identified", ((PrincipalInfo)this.principalInfo.get()).getKnownIdentity().get().id()));
      }

      return matches;
   }

   @Override
   public String displayName() {
      return "User is identified";
   }

   @SuppressFBWarnings(justification = "generated code")
   public static UserIdentifiedCondition.UserIdentifiedConditionBuilder builder() {
      return new UserIdentifiedCondition.UserIdentifiedConditionBuilder();
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class UserIdentifiedConditionBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private Provider<PrincipalInfo> principalInfo;

      @SuppressFBWarnings(justification = "generated code")
      UserIdentifiedConditionBuilder() {
      }

      @SuppressFBWarnings(justification = "generated code")
      public UserIdentifiedCondition.UserIdentifiedConditionBuilder principalInfo(Provider<PrincipalInfo> principalInfo) {
         this.principalInfo = principalInfo;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public UserIdentifiedCondition build() {
         return new UserIdentifiedCondition(this.principalInfo);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "UserIdentifiedCondition.UserIdentifiedConditionBuilder(principalInfo=" + this.principalInfo + ")";
      }
   }
}
