package com.airlock.iam.login.application.service.session;

import com.airlock.iam.base.api.domain.model.user.UserId;
import com.airlock.iam.common.domain.model.session.SessionId;
import com.airlock.iam.core.application.configuration.waf.AirlockGatewayConfig;
import com.airlock.iam.login.domain.model.session.AuditToken;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Optional;
import org.apache.commons.lang3.StringUtils;

public final class AuditTokenFactoryImpl implements AuditTokenFactory {
   private final Provider<Optional<AirlockGatewayConfig>> wafConfig;
   private final Provider<SessionId> sessionId;

   @Inject
   public AuditTokenFactoryImpl(Provider<Optional<AirlockGatewayConfig>> wafConfig, Provider<SessionId> sessionId) {
      this.wafConfig = wafConfig;
      this.sessionId = sessionId;
   }

   @Override
   public Optional<AuditToken> createAuditToken(UserId userId) {
      String sessionId = ((SessionId)this.sessionId.get()).id();
      if (((Optional)this.wafConfig.get()).isEmpty()) {
         return Optional.of(sessionId).map(AuditToken::new);
      }

      String auditTokenValue = ((AirlockGatewayConfig)((Optional)this.wafConfig.get()).get()).getAuditToken().getAuditTokenValue(sessionId, userId.getValue());
      return Optional.ofNullable(StringUtils.trimToNull(auditTokenValue)).map(AuditToken::new);
   }
}
