package com.airlock.iam.authentication.application.service;

import com.airlock.iam.base.api.domain.model.user.UserId;
import com.airlock.iam.base.misc.log.LogUtil;
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 jakarta.inject.Inject;
import jakarta.inject.Provider;

public class AuthenticationInformationService {
   private static final ELogger LOG = ELoggerFactory.getLogger(AuthenticationInformationService.class);
   private final Provider<PrincipalInfo> principalInfo;
   private final Provider<FlowCondition> condition;

   @Inject
   public AuthenticationInformationService(Provider<PrincipalInfo> principalInfo, Provider<FlowCondition> condition) {
      this.principalInfo = principalInfo;
      this.condition = condition;
   }

   public boolean isAuthenticationInformationAccessible() {
      if (((PrincipalInfo)this.principalInfo.get()).getAuthenticatedIdentity().isPresent()) {
         return true;
      }

      if (((PrincipalInfo)this.principalInfo.get()).getKnownIdentity().isPresent()) {
         if (((FlowCondition)this.condition.get()).isFulfilled()) {
            return true;
         }

         UserId knownIdentity = ((PrincipalInfo)this.principalInfo.get()).getKnownIdentity().get().id();
         LOG.debug(
            String.format(
               "Condition %s is not fulfilled for user %s",
               LogUtil.quote(((FlowCondition)this.condition.get()).displayName()),
               LogUtil.logSafeQuote(knownIdentity)
            )
         );
         return false;
      } else {
         LOG.debug("User identity not known");
         return false;
      }
   }
}
