package com.airlock.iam.admin.domain.model.token.vasco;

import com.airlock.iam.admin.application.service.token.vasco.VascoOtpDeviceId;
import com.airlock.iam.base.api.domain.model.Entity;
import com.airlock.iam.base.api.domain.model.identity.Identity;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Date;
import java.util.Optional;

public class VascoOtpDeviceUserView implements Entity<VascoOtpDeviceUserView> {
   private final VascoOtpDevice device;
   private final VascoOtpAssignment assignment;
   private Optional<VascoOtpLetterOrder> letterOrder;
   private final Optional<String> trackingId;
   private Optional<VascoOtpDeviceId> nextDeviceId;
   private Optional<VascoOtpDeviceId> previousDeviceId;
   private final Identity<VascoOtpDeviceUserView> identity;

   public Identity<VascoOtpDeviceUserView> getId() {
      return this.identity;
   }

   public void orderLetter(String adminName) {
      this.letterOrder = Optional.of(new VascoOtpLetterOrder(adminName, new Date()));
   }

   public void cancelLetterOrder() {
      this.letterOrder = Optional.empty();
   }

   public void unassign() {
      this.device.unassign(this.assignment.getUserId());
      this.nextDeviceId = Optional.empty();
      this.previousDeviceId = Optional.empty();
      this.letterOrder = Optional.empty();
   }

   public void setNextDeviceId(VascoOtpDeviceId next) {
      this.nextDeviceId = Optional.of(next);
   }

   public void clearNextDevice() {
      this.nextDeviceId = Optional.empty();
   }

   public void setPreviousDeviceId(VascoOtpDeviceId previous) {
      this.previousDeviceId = Optional.of(previous);
   }

   public void clearPreviousDevice() {
      this.previousDeviceId = Optional.empty();
   }

   public VascoOtpDeviceId getDeviceId() {
      return this.device.getDeviceId();
   }

   public Optional<Date> getActivationDate() {
      return this.device.getActivationDate();
   }

   public Optional<Date> getFirstUsageDate() {
      return this.device.getFirstUsageDate();
   }

   public Optional<Date> getLastUsageDate() {
      return this.device.getLastUsageDate();
   }

   public int getTotalUsages() {
      return this.device.getTotalUsages();
   }

   public boolean isEnabled() {
      return this.device.isEnabled();
   }

   public Optional<Date> getValidFrom() {
      return this.device.getValidFrom();
   }

   public Optional<Date> getValidTo() {
      return this.device.getValidTo();
   }

   public boolean isAssignedTo(String userId) {
      return this.device.isAssignedTo(userId);
   }

   public String getUserId() {
      return this.assignment.getUserId();
   }

   public String getAssignedBy() {
      return this.assignment.getAssignedBy();
   }

   public Date getAssignmentDate() {
      return this.assignment.getAssignmentDate();
   }

   public Optional<String> getAdditionalInfo() {
      return this.assignment.getAdditionalInfo();
   }

   public Optional<String> getComment() {
      return this.assignment.getComment();
   }

   @SuppressFBWarnings(justification = "generated code")
   VascoOtpDeviceUserView(
      VascoOtpDevice device,
      VascoOtpAssignment assignment,
      Optional<VascoOtpLetterOrder> letterOrder,
      Optional<String> trackingId,
      Optional<VascoOtpDeviceId> nextDeviceId,
      Optional<VascoOtpDeviceId> previousDeviceId,
      Identity<VascoOtpDeviceUserView> identity
   ) {
      this.device = device;
      this.assignment = assignment;
      this.letterOrder = letterOrder;
      this.trackingId = trackingId;
      this.nextDeviceId = nextDeviceId;
      this.previousDeviceId = previousDeviceId;
      this.identity = identity;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public VascoOtpDevice getDevice() {
      return this.device;
   }

   @SuppressFBWarnings(justification = "generated code")
   public VascoOtpAssignment getAssignment() {
      return this.assignment;
   }

   @SuppressFBWarnings(justification = "generated code")
   public Optional<VascoOtpLetterOrder> getLetterOrder() {
      return this.letterOrder;
   }

   @SuppressFBWarnings(justification = "generated code")
   public Optional<String> getTrackingId() {
      return this.trackingId;
   }

   @SuppressFBWarnings(justification = "generated code")
   public Optional<VascoOtpDeviceId> getNextDeviceId() {
      return this.nextDeviceId;
   }

   @SuppressFBWarnings(justification = "generated code")
   public Optional<VascoOtpDeviceId> getPreviousDeviceId() {
      return this.previousDeviceId;
   }

   @SuppressFBWarnings(justification = "generated code")
   public Identity<VascoOtpDeviceUserView> getIdentity() {
      return this.identity;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class VascoOtpDeviceUserViewBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private VascoOtpDevice device;
      @SuppressFBWarnings(justification = "generated code")
      private VascoOtpAssignment assignment;
      @SuppressFBWarnings(justification = "generated code")
      private Optional<VascoOtpLetterOrder> letterOrder;
      @SuppressFBWarnings(justification = "generated code")
      private Optional<String> trackingId;
      @SuppressFBWarnings(justification = "generated code")
      private Optional<VascoOtpDeviceId> nextDeviceId;
      @SuppressFBWarnings(justification = "generated code")
      private Optional<VascoOtpDeviceId> previousDeviceId;
      @SuppressFBWarnings(justification = "generated code")
      private Identity<VascoOtpDeviceUserView> identity;

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

      @SuppressFBWarnings(justification = "generated code")
      public VascoOtpDeviceUserView.VascoOtpDeviceUserViewBuilder device(VascoOtpDevice device) {
         this.device = device;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public VascoOtpDeviceUserView.VascoOtpDeviceUserViewBuilder assignment(VascoOtpAssignment assignment) {
         this.assignment = assignment;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public VascoOtpDeviceUserView.VascoOtpDeviceUserViewBuilder letterOrder(Optional<VascoOtpLetterOrder> letterOrder) {
         this.letterOrder = letterOrder;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public VascoOtpDeviceUserView.VascoOtpDeviceUserViewBuilder trackingId(Optional<String> trackingId) {
         this.trackingId = trackingId;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public VascoOtpDeviceUserView.VascoOtpDeviceUserViewBuilder nextDeviceId(Optional<VascoOtpDeviceId> nextDeviceId) {
         this.nextDeviceId = nextDeviceId;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public VascoOtpDeviceUserView.VascoOtpDeviceUserViewBuilder previousDeviceId(Optional<VascoOtpDeviceId> previousDeviceId) {
         this.previousDeviceId = previousDeviceId;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public VascoOtpDeviceUserView.VascoOtpDeviceUserViewBuilder identity(Identity<VascoOtpDeviceUserView> identity) {
         this.identity = identity;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public VascoOtpDeviceUserView build() {
         return new VascoOtpDeviceUserView(
            this.device, this.assignment, this.letterOrder, this.trackingId, this.nextDeviceId, this.previousDeviceId, this.identity
         );
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "VascoOtpDeviceUserView.VascoOtpDeviceUserViewBuilder(device="
            + this.device
            + ", assignment="
            + this.assignment
            + ", letterOrder="
            + this.letterOrder
            + ", trackingId="
            + this.trackingId
            + ", nextDeviceId="
            + this.nextDeviceId
            + ", previousDeviceId="
            + this.previousDeviceId
            + ", identity="
            + this.identity
            + ")";
      }
   }
}
