package com.airlock.iam.login.domain.model.targetapp;

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.common.domain.model.auth.idpropagation.WafCredentialIdleTimeout;
import com.airlock.iam.common.domain.model.auth.idpropagation.WafCredentialLifetime;
import com.airlock.iam.common.domain.model.auth.idpropagation.WafCredentialTimeout;
import com.airlock.iam.common.domain.model.valueprovider.contextdata.ContextDataStringValueProvider;
import com.airlock.iam.login.application.configuration.targetapp.UserSpecificTimeoutProviderConfig;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.inject.Inject;
import java.util.List;
import java.util.Optional;

@LogicForConfig(UserSpecificTimeoutProviderConfig.class)
public class UserSpecificTimeoutProvider implements TimeoutProvider {
   private final ContextDataStringValueProvider contextDataStringValueProvider;
   private final List<RoleTimeoutRule> roleTimeoutRuleList;
   private final Optional<WafCredentialIdleTimeout> defaultIdleTimeout;
   private final Optional<WafCredentialLifetime> defaultLifeTime;

   @Inject
   public UserSpecificTimeoutProvider(
      ContextDataStringValueProvider contextDataStringValueProvider,
      List<RoleTimeoutRule> roleTimeoutRuleList,
      Optional<WafCredentialIdleTimeout> defaultIdleTimeout,
      Optional<WafCredentialLifetime> defaultLifeTime
   ) {
      this.contextDataStringValueProvider = contextDataStringValueProvider;
      this.roleTimeoutRuleList = roleTimeoutRuleList;
      this.defaultIdleTimeout = defaultIdleTimeout;
      this.defaultLifeTime = defaultLifeTime;
   }

   @Override
   public Optional<WafCredentialTimeout> getTimeout() {
      String contextDataValue = this.contextDataStringValueProvider.getValue();
      return this.roleTimeoutRuleList
         .stream()
         .filter(roleTimeoutRule -> roleTimeoutRule.getTimeoutIdentifier().equals(contextDataValue))
         .map(
            c -> WafCredentialTimeout.builder(WafCredentialIdleTimeout.idleTimeout(c.getIdleTimeout()))
               .lifetime(c.getLifetime().map(WafCredentialLifetime::lifetime))
               .build()
         )
         .findFirst()
         .or(() -> WafCredentialTimeout.wafCredentialTimeout(this.defaultIdleTimeout, this.defaultLifeTime));
   }

   @SuppressFBWarnings(justification = "generated code")
   public ContextDataStringValueProvider getContextDataStringValueProvider() {
      return this.contextDataStringValueProvider;
   }

   @SuppressFBWarnings(justification = "generated code")
   public List<RoleTimeoutRule> getRoleTimeoutRuleList() {
      return this.roleTimeoutRuleList;
   }

   @SuppressFBWarnings(justification = "generated code")
   public Optional<WafCredentialIdleTimeout> getDefaultIdleTimeout() {
      return this.defaultIdleTimeout;
   }

   @SuppressFBWarnings(justification = "generated code")
   public Optional<WafCredentialLifetime> getDefaultLifeTime() {
      return this.defaultLifeTime;
   }
}
