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

import com.airlock.iam.base.misc.log.LogUtil;
import com.airlock.iam.common.api.domain.model.persistency.exception.PersisterException;
import com.airlock.iam.common.api.domain.model.user.PersistentUser;
import com.airlock.iam.core.misc.persistency.ExtendedUserPersister;
import com.airlock.iam.core.misc.persistency.UserIterator;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.log.audit.AuditLogger;
import com.airlock.iam.log.usertrail.UserTrailLogger;
import com.airlock.iam.plugin.api.annotation.config.Groups;
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;

@Plugin(
   description = "Server task that checks all self-registered users and deletes unused accounts. This prevents the database from\nbeing filled with inactive self-registered users. Self-registered users that have never logged in are deleted\nafter a configurable number of minutes. If they have logged in at least once, this task will never delete them."
)
@PluginLicenseRestriction(moduleAffiliation = "SelfRegistration")
@Groups(groupSequence = {"Basic Settings", "Advanced Settings"}, openGroups = "Basic Settings")
public class SelfRegUsersCleanUpTask extends AbstractSelfRegUsersTask {
   private static final ELogger LOG = ELoggerFactory.getLogger(SelfRegUsersCleanUpTask.class);

   @Override
   protected ELogger getLogger() {
      return LOG;
   }

   private void doAction(PersistentUser user, String reason, UserIteratorTaskConfiguration config) throws PersisterException {
      String uid = user.getName();
      String logMsg = "Deleting user " + uid + " because: " + reason;
      this.getLogger().debug(logMsg);
      UserTrailLogger.log(uid, logMsg);
      ((ExtendedUserPersister)config.getUserPersister()).deleteUser(uid);
      AuditLogger.log("The user " + LogUtil.quote(uid) + " was deleted by Self Reg Users Clean Up Task.");
   }

   @Override
   protected void doActionNotLoggedIn(PersistentUser user, String reason, UserIteratorTaskConfiguration config) throws PersisterException {
      this.doAction(user, reason, config);
   }

   public SelfRegUsersCleanUpTask(ExtendedUserPersister userPersister, UserIterator userIterator, Integer neverLoggedInMinutes) {
      super(userPersister, userIterator, neverLoggedInMinutes);
   }

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

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

   @SuppressFBWarnings(justification = "generated code")
   public static class SelfRegUsersCleanUpTaskBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private ExtendedUserPersister userPersister;
      @SuppressFBWarnings(justification = "generated code")
      private UserIterator userIterator;
      @SuppressFBWarnings(justification = "generated code")
      private Integer neverLoggedInMinutes;

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

      @SuppressFBWarnings(justification = "generated code")
      public SelfRegUsersCleanUpTask.SelfRegUsersCleanUpTaskBuilder userPersister(ExtendedUserPersister userPersister) {
         this.userPersister = userPersister;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public SelfRegUsersCleanUpTask.SelfRegUsersCleanUpTaskBuilder userIterator(UserIterator userIterator) {
         this.userIterator = userIterator;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public SelfRegUsersCleanUpTask.SelfRegUsersCleanUpTaskBuilder neverLoggedInMinutes(Integer neverLoggedInMinutes) {
         this.neverLoggedInMinutes = neverLoggedInMinutes;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public SelfRegUsersCleanUpTask build() {
         return new SelfRegUsersCleanUpTask(this.userPersister, this.userIterator, this.neverLoggedInMinutes);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "SelfRegUsersCleanUpTask.SelfRegUsersCleanUpTaskBuilder(userPersister="
            + this.userPersister
            + ", userIterator="
            + this.userIterator
            + ", neverLoggedInMinutes="
            + this.neverLoggedInMinutes
            + ")";
      }
   }
}
