package com.airlock.iam.admin.application.service.token.vasco;

import com.airlock.iam.common.api.domain.model.persistency.exception.PersisterException;
import com.airlock.iam.core.misc.impl.notification.VascoNotifierVariableBean;
import com.airlock.iam.core.misc.impl.notification.VascoNotifierVariableBean.Variable;
import com.airlock.iam.core.misc.notification.Notifier;
import com.airlock.iam.core.misc.notification.NotifierException;
import com.airlock.iam.log.api.helpdesk.HelpdeskLogger;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.inject.Inject;
import java.util.Optional;

public class VascoOtpAssignmentNotifier {
   private final Optional<Notifier> notifier;
   private final HelpdeskLogger logger;

   @Inject
   public VascoOtpAssignmentNotifier(Optional<Notifier> notifier, HelpdeskLogger logger) {
      this.notifier = notifier;
      this.logger = logger;
   }

   public void notifyUserAboutAssignment(String userId, VascoOtpDeviceId deviceId) {
      if (this.notifier.isPresent()) {
         VascoNotifierVariableBean notifierVariableBean = new VascoNotifierVariableBean();
         notifierVariableBean.setValue(Variable.USERNAME, userId);
         notifierVariableBean.setValue(Variable.SERIALID, deviceId.asString());

         try {
            this.notifier.get().notifyUser(userId, notifierVariableBean);
            this.logger.log(userId, "User was notified that Vasco OTP device " + deviceId.asString() + " was assigned.");
         } catch (PersisterException | NotifierException e) {
            this.logger.log(userId, "User could NOT be notified that Vasco OTP device " + deviceId.asString() + " was assigned: " + e.getMessage());
         }
      }
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public static class VascoOtpAssignmentNotifierBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private Optional<Notifier> notifier;
      @SuppressFBWarnings(justification = "generated code")
      private HelpdeskLogger logger;

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

      @SuppressFBWarnings(justification = "generated code")
      public VascoOtpAssignmentNotifier.VascoOtpAssignmentNotifierBuilder notifier(Optional<Notifier> notifier) {
         this.notifier = notifier;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public VascoOtpAssignmentNotifier.VascoOtpAssignmentNotifierBuilder logger(HelpdeskLogger logger) {
         this.logger = logger;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public VascoOtpAssignmentNotifier build() {
         return new VascoOtpAssignmentNotifier(this.notifier, this.logger);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "VascoOtpAssignmentNotifier.VascoOtpAssignmentNotifierBuilder(notifier=" + this.notifier + ", logger=" + this.logger + ")";
      }
   }
}
