package com.airlock.iam.common.domain.model.templock;

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.common.api.domain.model.locking.TemporaryLockingStrategy;
import com.airlock.iam.common.application.configuration.templock.ExponentialTemporaryLockingStrategyConfig;
import com.airlock.iam.core.misc.authen.locking.ExponentialTemporaryLockingCalculator;
import com.google.common.base.Preconditions;
import jakarta.inject.Inject;
import java.time.Duration;

@LogicForConfig(ExponentialTemporaryLockingStrategyConfig.class)
public class ExponentialTemporaryLockingStrategy implements TemporaryLockingStrategy {
   private final ExponentialTemporaryLockingCalculator calculator;

   @Inject
   public ExponentialTemporaryLockingStrategy(ExponentialTemporaryLockingStrategyConfig config) {
      this.calculator = newTemporaryLockingCalculator(config);
   }

   @Override
   public Duration calculateLockoutDuration(int failedAttemptCount) {
      Preconditions.checkArgument(failedAttemptCount >= 0);
      return failedAttemptCount == 0 ? Duration.ZERO : this.calculator.computeDelayAfterFailedLogins(failedAttemptCount);
   }

   private static ExponentialTemporaryLockingCalculator newTemporaryLockingCalculator(ExponentialTemporaryLockingStrategyConfig config) {
      return ExponentialTemporaryLockingCalculator.builder()
         .initialLoginDelay(Duration.ofMillis(config.getBaseDurationMs()))
         .exponentialLockoutFactor(config.getExponentialFactor())
         .linearLockoutFactor(config.getAdditionalDurationMs())
         .build();
   }
}
