package com.airlock.iam.servicecontainer.app.application.configuration.task;

import com.airlock.iam.common.api.domain.model.persistency.exception.PersisterException;
import com.airlock.iam.core.misc.persistency.CredentialIterator;
import com.airlock.iam.core.misc.persistency.CredentialPersister;
import com.airlock.iam.core.misc.renderer.CredentialBeanBasedUserCredentialBean;
import com.airlock.iam.core.misc.renderer.CredentialSecretGenerator;
import com.airlock.iam.core.misc.renderer.UserCredentialBean;
import com.airlock.iam.core.misc.util.report.aggregation.AggregateReport;
import com.airlock.iam.plugin.api.annotation.config.Plugin;
import com.airlock.iam.plugin.api.annotation.property.PluginProperty;
import com.airlock.iam.servicecontainer.app.application.configuration.task.token.TokenCleanup;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.List;

@Plugin(
   description = "Server task that checks all users for a flag indicating that a new letter with a secret (e.g. activation code) should be generated.<p>Unlike the \"Password Batch Task\" this plugin uses a credential persister / iterator.</p><p>Generated secrets are rendered (e.g. made a pdf or printed) using a <class>PasswordRenderer</class> plugin.</p>"
)
public class CredentialSecretBatchTask extends AbstractSecretStringBatchTask {
   @PluginProperty(
      description = "The credential iterator plugin used to iterate over all users' credentials. Usually this is the same as the credential persister.",
      optional = false
   )
   private CredentialIterator credentialIterator;
   @PluginProperty(description = "The credential persister plugin used to read and store credential data structures.", optional = false)
   private CredentialPersister credentialPersister;

   @Override
   protected List<String> getAllUserIds() throws PersisterException {
      return this.credentialIterator.getAllUserIds();
   }

   @Override
   protected UserCredentialBean getUserCredentialData(String uid) throws PersisterException {
      return new CredentialBeanBasedUserCredentialBean(
         uid, this.credentialPersister.getPersistentCredentialByUsername(uid), this.credentialPersister, this.getConfig().isHashValueBinary()
      );
   }

   public CredentialSecretBatchTask(
      long deliverySecurityGapDays,
      AggregateReport aggregateReport,
      CredentialSecretGenerator credentialSecretGenerator,
      List<TokenCleanup> tokenCleanupConfigs,
      CredentialIterator credentialIterator,
      CredentialPersister credentialPersister
   ) {
      super(deliverySecurityGapDays, aggregateReport, credentialSecretGenerator, tokenCleanupConfigs);
      this.credentialIterator = credentialIterator;
      this.credentialPersister = credentialPersister;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public CredentialSecretBatchTask() {
   }

   @SuppressFBWarnings(justification = "generated code")
   public CredentialSecretBatchTask(CredentialIterator credentialIterator, CredentialPersister credentialPersister) {
      this.credentialIterator = credentialIterator;
      this.credentialPersister = credentialPersister;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class CredentialSecretBatchTaskBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private long deliverySecurityGapDays;
      @SuppressFBWarnings(justification = "generated code")
      private AggregateReport aggregateReport;
      @SuppressFBWarnings(justification = "generated code")
      private CredentialSecretGenerator credentialSecretGenerator;
      @SuppressFBWarnings(justification = "generated code")
      private List<TokenCleanup> tokenCleanupConfigs;
      @SuppressFBWarnings(justification = "generated code")
      private CredentialIterator credentialIterator;
      @SuppressFBWarnings(justification = "generated code")
      private CredentialPersister credentialPersister;

      @SuppressFBWarnings(justification = "generated code")
      CredentialSecretBatchTaskBuilder() {
      }

      @SuppressFBWarnings(justification = "generated code")
      public CredentialSecretBatchTask.CredentialSecretBatchTaskBuilder deliverySecurityGapDays(long deliverySecurityGapDays) {
         this.deliverySecurityGapDays = deliverySecurityGapDays;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public CredentialSecretBatchTask.CredentialSecretBatchTaskBuilder aggregateReport(AggregateReport aggregateReport) {
         this.aggregateReport = aggregateReport;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public CredentialSecretBatchTask.CredentialSecretBatchTaskBuilder credentialSecretGenerator(CredentialSecretGenerator credentialSecretGenerator) {
         this.credentialSecretGenerator = credentialSecretGenerator;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public CredentialSecretBatchTask.CredentialSecretBatchTaskBuilder tokenCleanupConfigs(List<TokenCleanup> tokenCleanupConfigs) {
         this.tokenCleanupConfigs = tokenCleanupConfigs;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public CredentialSecretBatchTask.CredentialSecretBatchTaskBuilder credentialIterator(CredentialIterator credentialIterator) {
         this.credentialIterator = credentialIterator;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public CredentialSecretBatchTask.CredentialSecretBatchTaskBuilder credentialPersister(CredentialPersister credentialPersister) {
         this.credentialPersister = credentialPersister;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public CredentialSecretBatchTask build() {
         return new CredentialSecretBatchTask(
            this.deliverySecurityGapDays,
            this.aggregateReport,
            this.credentialSecretGenerator,
            this.tokenCleanupConfigs,
            this.credentialIterator,
            this.credentialPersister
         );
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "CredentialSecretBatchTask.CredentialSecretBatchTaskBuilder(deliverySecurityGapDays="
            + this.deliverySecurityGapDays
            + ", aggregateReport="
            + this.aggregateReport
            + ", credentialSecretGenerator="
            + this.credentialSecretGenerator
            + ", tokenCleanupConfigs="
            + this.tokenCleanupConfigs
            + ", credentialIterator="
            + this.credentialIterator
            + ", credentialPersister="
            + this.credentialPersister
            + ")";
      }
   }
}
