package com.airlock.iam.factor.domain.service.airlock2fa;

import com.airlock.iam.airlock2fa.api.domain.model.Airlock2FAAccountId;
import com.airlock.iam.base.misc.time.TimeProvider;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.factor.domain.model.airlock2fa.order.Airlock2FAActivationLetterOrder;
import com.airlock.iam.factor.domain.model.airlock2fa.order.Airlock2FAActivationLetterOrderCreator;
import com.airlock.iam.factor.domain.model.airlock2fa.order.Airlock2FAActivationLetterOrderId;
import com.airlock.iam.factor.domain.service.airlock2fa.activation.Airlock2FAActivationLetterOrderService;
import com.airlock.iam.factor.domain.service.airlock2fa.repository.Airlock2FAActivationLetterOrderRepository;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.List;
import java.util.Optional;

public final class Airlock2FAActivationLetterOrderServiceImpl implements Airlock2FAActivationLetterOrderService {
   private static final ELogger LOG = ELoggerFactory.getLogger(Airlock2FAActivationLetterOrderServiceImpl.class);
   private final Provider<Airlock2FAActivationLetterOrderRepository> orderRepository;
   private final Provider<TimeProvider> timeProvider;

   @Inject
   public Airlock2FAActivationLetterOrderServiceImpl(Provider<Airlock2FAActivationLetterOrderRepository> orderRepository, Provider<TimeProvider> timeProvider) {
      this.orderRepository = orderRepository;
      this.timeProvider = timeProvider;
   }

   @Override
   public List<Airlock2FAActivationLetterOrder> listOpenOrders() {
      return ((Airlock2FAActivationLetterOrderRepository)this.orderRepository.get()).listOpenOrders();
   }

   @Override
   public List<Airlock2FAActivationLetterOrder> findOpenOrders(Airlock2FAAccountId accountId) {
      return ((Airlock2FAActivationLetterOrderRepository)this.orderRepository.get()).findOpenOrders(accountId);
   }

   @Override
   public Optional<Airlock2FAActivationLetterOrder> createOrder(Airlock2FAAccountId accountId, Airlock2FAActivationLetterOrderCreator creator) {
      if (!this.findOpenOrders(accountId).isEmpty()) {
         LOG.info(String.format("User with Airlock 2FA account ID '%s' already has opened activation letter orders. No new order was generated.", accountId));
         return Optional.empty();
      } else {
         Airlock2FAActivationLetterOrder order = Airlock2FAActivationLetterOrder.activationOrder(
            Airlock2FAActivationLetterOrderId.newActivationLetterOrderId(), accountId, creator, ((TimeProvider)this.timeProvider.get()).getCurrentInstant()
         );
         ((Airlock2FAActivationLetterOrderRepository)this.orderRepository.get()).insert(order);
         return Optional.of(order);
      }
   }

   @Override
   public boolean deleteOrder(Airlock2FAAccountId accountId, Airlock2FAActivationLetterOrderId orderId) {
      return ((Airlock2FAActivationLetterOrderRepository)this.orderRepository.get()).delete(orderId, accountId);
   }
}
