package com.airlock.iam.common.application.configuration.templock;

import com.airlock.iam.common.domain.model.templock.ExponentialTemporaryLockingStrategy;
import com.airlock.iam.plugin.api.config.ConfigurationContext;
import com.airlock.iam.plugin.api.config.ConfigurationEnvironment;
import com.airlock.iam.plugin.api.config.PluginConfiguration;
import com.airlock.iam.plugin.api.exception.PropertyConstraintViolationException;
import com.airlock.iam.plugin.api.exception.PropertyTypeMismatchException;
import com.airlock.iam.plugin.api.valuereader.DoublePropertyValueReader;
import com.airlock.iam.plugin.api.valuereader.IntegerPropertyValueReader;
import com.airlock.iam.plugin.framework.application.service.builder.plugin.PluginPropertyBuilderInitializer;

public class ExponentialTemporaryLockingStrategyConfigTestlet extends TemporaryLockingStrategyConfigTestlet {
   @Override
   protected ExponentialTemporaryLockingStrategy createStrategyUnderTest(PluginConfiguration c, ConfigurationEnvironment env, ConfigurationContext context) throws PropertyConstraintViolationException, PropertyTypeMismatchException {
      Integer baseDurationMs = IntegerPropertyValueReader.effectiveIntegerConfigValue(c, "baseDurationMs", env, context);
      Double exponentialFactor = DoublePropertyValueReader.effectiveDoublePropertyValue(c, "exponentialFactor", env, context);
      Integer additionalDurationMs = IntegerPropertyValueReader.effectiveIntegerConfigValue(c, "additionalDurationMs", env, context);
      ExponentialTemporaryLockingStrategyConfig strategyConfig = ((ExponentialTemporaryLockingStrategyConfig.ExponentialTemporaryLockingStrategyConfigBuilder)PluginPropertyBuilderInitializer.pluginBuilder(
            ExponentialTemporaryLockingStrategyConfig.ExponentialTemporaryLockingStrategyConfigBuilder.class
         ))
         .baseDurationMs(baseDurationMs)
         .exponentialFactor(exponentialFactor)
         .additionalDurationMs(additionalDurationMs)
         .build();
      return new ExponentialTemporaryLockingStrategy(strategyConfig);
   }
}
