package com.airlock.iam.authentication.application.configuration.targetapp;

import com.airlock.iam.base.misc.log.LogUtil;
import com.airlock.iam.plugin.api.config.ConfigurationContext;
import com.airlock.iam.plugin.api.config.ConfigurationEnvironment;
import com.airlock.iam.plugin.api.config.Environment;
import com.airlock.iam.plugin.api.config.PluginConfiguration;
import com.airlock.iam.plugin.api.exception.ConfigurationException;
import com.airlock.iam.plugin.api.exception.PropertyConfigurationException;
import com.airlock.iam.plugin.framework.misc.config.validation.RecursivePluginValidator;
import com.airlock.iam.plugin.framework.misc.config.validation.RecursivePluginValidator.ValidatorArguments;
import java.util.Optional;
import org.apache.commons.lang3.Strings;

public final class ValidateNoTransactionApprovalPlugins {
   private static final String TRANSACTION_APPROVAL_PACKAGE = "com.airlock.iam.transactionapproval";

   private ValidateNoTransactionApprovalPlugins() {
   }

   static void validateNoTransactionApprovalPlugins(PluginConfiguration pc, ConfigurationEnvironment env, ConfigurationContext context, Environment valEnv) throws ConfigurationException {
      new RecursivePluginValidator(pc, env, context, valEnv).validate(ValidateNoTransactionApprovalPlugins::validateNoTransactionApprovalPlugin);
   }

   private static Optional<PropertyConfigurationException> validateNoTransactionApprovalPlugin(ValidatorArguments arguments) {
      return Strings.CS.startsWith(arguments.pluginConfig().getPluginClassName(), "com.airlock.iam.transactionapproval")
         ? Optional.of(
            new PropertyConfigurationException(
               arguments.parent(),
               arguments.env(),
               arguments.context(),
               "Plugin of type "
                  + LogUtil.quote(arguments.pluginConfig().getPluginClassDisplayName())
                  + " is a Transaction Approval plugin and cannot be configured in an authentication flow.",
               new String[]{arguments.propertyName()}
            )
         )
         : Optional.empty();
   }
}
