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

import com.airlock.iam.common.api.domain.model.locking.TemporaryLockingStrategy;
import com.airlock.iam.common.domain.model.templock.ExponentialTemporaryLockingStrategy;
import com.airlock.iam.core.misc.authen.locking.TemporaryLockingTestletHelper;
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.PropertyConfigurationException;
import com.airlock.iam.plugin.api.exception.PropertyConstraintViolationException;
import com.airlock.iam.plugin.api.exception.PropertyTypeMismatchException;
import com.airlock.iam.plugin.api.testlet.Testlet;
import com.airlock.iam.plugin.api.testlet.Testlet.TestletResult;
import com.airlock.iam.plugin.api.testlet.Testlet.TestletType;
import com.airlock.iam.plugin.api.testlet.Testlet.TestletResult.TestResult;

public abstract class TemporaryLockingStrategyConfigTestlet implements Testlet {
   public TestletResult performTest(PluginConfiguration config, ConfigurationEnvironment env, ConfigurationContext context) throws PropertyConfigurationException {
      return this.performTest(this.createStrategyUnderTest(config, env, context));
   }

   private TestletResult performTest(TemporaryLockingStrategy strategy) {
      String message = TemporaryLockingTestletHelper.getProjectedDelaysMessage(strategy::calculateLockoutDuration);
      return new TestletResult(TestResult.SUCCESSFUL, "Exponential Temporary Locking Strategy", message);
   }

   protected abstract ExponentialTemporaryLockingStrategy createStrategyUnderTest(
      PluginConfiguration var1, ConfigurationEnvironment var2, ConfigurationContext var3
   ) throws PropertyConstraintViolationException, PropertyTypeMismatchException;

   public TestletType getType() {
      return TestletType.RESULT;
   }

   public boolean areRequiredPropertiesConfigured(PluginConfiguration config, ConfigurationEnvironment env, ConfigurationContext context) {
      return true;
   }

   public String getRequiredPropertiesMissingMessage() {
      return "Please configure all mandatory properties.";
   }
}
