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

import com.airlock.iam.factor.domain.model.airlock2fa.activation.Airlock2FAActivationCode;
import com.airlock.iam.factor.domain.model.airlock2fa.activation.Airlock2FAActivationCodeShort;
import com.airlock.iam.factor.domain.model.airlock2fa.activation.Airlock2FAActivationLetter;
import com.airlock.iam.factor.domain.model.airlock2fa.activation.Airlock2FAActivationLetterId;
import com.airlock.iam.factor.domain.model.airlock2fa.qrcode.Airlock2FAQrCodeImage;
import com.airlock.iam.factor.domain.service.airlock2fa.QrCodeImageReader;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.time.Instant;
import java.util.Optional;
import lombok.NonNull;

public final class Airlock2FAActivationLetterWithConfidentialDataViewer implements Airlock2FAActivationLetterViewer {
   @NonNull
   private final Airlock2FAActivationLetter activationLetter;
   @NonNull
   private final QrCodeImageReader qrCodeImageReader;

   @Override
   public Airlock2FAActivationLetterId letterId() {
      return this.activationLetter.getId();
   }

   @Override
   public Instant expires() {
      return this.activationLetter.getEnrollment().getExpires();
   }

   @Override
   public Instant created() {
      return this.activationLetter.getEnrollment().getCreated();
   }

   @Override
   public String shortenedActivationCode() {
      return this.getActivationCode().getShortenedActivationCode();
   }

   @Override
   public Optional<Airlock2FAConfidentialActivation> retrieveConfidentialActivation() {
      Airlock2FAQrCodeImage qrCodeImage = this.qrCodeImageReader.retrieveFrom(this.activationLetter.getEnrollment().getActivationQrCodeUrl().getUrl());
      return Optional.of(
         Airlock2FAConfidentialActivation.confidentialAirlock2FAActivation(this.getActivationCode(), qrCodeImage, this.getActivationCodeShort())
      );
   }

   private Airlock2FAActivationCode getActivationCode() {
      return this.activationLetter.getEnrollment().getActivationCode();
   }

   private Optional<Airlock2FAActivationCodeShort> getActivationCodeShort() {
      return this.activationLetter.getEnrollment().getActivationCodeShort();
   }

   @SuppressFBWarnings(justification = "generated code")
   public Airlock2FAActivationLetterWithConfidentialDataViewer(
      @NonNull Airlock2FAActivationLetter activationLetter, @NonNull QrCodeImageReader qrCodeImageReader
   ) {
      if (activationLetter == null) {
         throw new NullPointerException("activationLetter is marked non-null but is null");
      }

      if (qrCodeImageReader == null) {
         throw new NullPointerException("qrCodeImageReader is marked non-null but is null");
      }

      this.activationLetter = activationLetter;
      this.qrCodeImageReader = qrCodeImageReader;
   }
}
