package com.airlock.iam.transactionapproval.application.configuration.flow;

import com.airlock.iam.flow.api.application.configuration.flowprocessor.FlowProcessorConfig;
import com.airlock.iam.flow.api.application.configuration.flowprocessor.FlowProcessorsConfig;
import com.airlock.iam.flow.shared.application.configuration.processor.DeviceUsageProcessorConfig;
import com.airlock.iam.flow.shared.application.configuration.processor.FactorUseReportingProcessorConfig;
import com.airlock.iam.flow.shared.application.configuration.processor.FailedFactorAttemptsProcessorConfig;
import com.airlock.iam.flow.shared.application.configuration.processor.RenewSessionIdProcessorConfig;
import com.airlock.iam.flow.shared.application.configuration.processor.UserIdentificationProcessorConfig;
import com.airlock.iam.flow.shared.application.configuration.processor.UserValidityProcessorConfig;
import com.airlock.iam.plugin.api.annotation.config.Plugin;
import com.airlock.iam.plugin.api.annotation.license.PluginLicenseRestriction;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.List;

@Plugin(
   description = "<p>This plugin automatically configures a list of essential flow processors, depending on the use case. Note that User Enumeration Protection and Temporary Locking cannot be used at the same time. Either one of two will be used depending on which one is enabled.</p><p>The processors are configured in this order:</p><ol><li>User Identification Processor</li><li>Default Transaction Approval Flow Processor</li><li>Factor Use Reporting Processor</li><li>Failed Factor Attempts Processor (with strict counting)</li><li>Renew Session ID Processor</li><li>User Validity Processor</li><li>Device Usage Processor</li></ol>"
)
@PluginLicenseRestriction(moduleAffiliation = "TransactionApproval")
public class DefaultTransactionApprovalProcessorsConfig implements FlowProcessorsConfig {
   public List<FlowProcessorConfig> getProcessors() {
      return List.of(
         UserIdentificationProcessorConfig.USER_IDENTIFICATION_PROCESSOR_CONFIG,
         DefaultTransactionApprovalFlowProcessorConfig.DEFAULT_TRANSACTION_APPROVAL_FLOW_PROCESSOR_CONFIG,
         FactorUseReportingProcessorConfig.FACTOR_USE_REPORTING_PROCESSOR_CONFIG,
         FailedFactorAttemptsProcessorConfig.STRICT_FAILED_FACTORS_COUNTING_PRECESSOR,
         RenewSessionIdProcessorConfig.RENEW_SESSION_ID_PROCESSOR,
         UserValidityProcessorConfig.USER_VALIDITY_PROCESSOR_CONFIG,
         DeviceUsageProcessorConfig.DEVICE_USAGE_PROCESSOR_CONFIG
      );
   }

   @SuppressFBWarnings(justification = "generated code")
   public static DefaultTransactionApprovalProcessorsConfig.DefaultTransactionApprovalProcessorsConfigBuilder builder() {
      return new DefaultTransactionApprovalProcessorsConfig.DefaultTransactionApprovalProcessorsConfigBuilder();
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class DefaultTransactionApprovalProcessorsConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      DefaultTransactionApprovalProcessorsConfigBuilder() {
      }

      @SuppressFBWarnings(justification = "generated code")
      public DefaultTransactionApprovalProcessorsConfig build() {
         return new DefaultTransactionApprovalProcessorsConfig();
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "DefaultTransactionApprovalProcessorsConfig.DefaultTransactionApprovalProcessorsConfigBuilder()";
      }
   }
}
