package com.airlock.iam.flow.shared.domain.service.newdevice;

import com.airlock.iam.base.misc.result.Result;
import com.airlock.iam.base.misc.time.TimeProvider;
import com.airlock.iam.elog.api.EDefaultLogType;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.flow.shared.domain.model.newdevice.LoginFromNewDeviceKnownUsers;
import com.airlock.iam.flow.shared.domain.model.newdevice.LoginFromNewDeviceSettings;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.time.Instant;

public final class LoginFromNewDeviceKnownUsersReader {
   private static final ELogger LOG = ELoggerFactory.getLogger(LoginFromNewDeviceKnownUsersReader.class);
   private final Provider<TimeProvider> time;
   private final Provider<LoginFromNewDeviceRequest> request;
   private final Provider<LoginFromNewDeviceSettings> settings;

   @Inject
   public LoginFromNewDeviceKnownUsersReader(
      Provider<TimeProvider> time, Provider<LoginFromNewDeviceRequest> request, Provider<LoginFromNewDeviceSettings> settings
   ) {
      this.time = time;
      this.request = request;
      this.settings = settings;
   }

   public LoginFromNewDeviceKnownUsers getValidKnownUsers() {
      Result<LoginFromNewDeviceKnownUsers, String> knownUsersResult = ((LoginFromNewDeviceRequest)this.request.get()).getKnownUsers();
      this.logFailure(knownUsersResult);
      return knownUsersResult.peek()
         .orElse(LoginFromNewDeviceKnownUsers.empty())
         .withoutExpiredUsers(((LoginFromNewDeviceSettings)this.settings.get()).validity(), this.now());
   }

   private void logFailure(Result<LoginFromNewDeviceKnownUsers, String> result) {
      result.peekFailure()
         .ifPresent(error -> LOG.warn(EDefaultLogType.GENERIC_LOG_TYPE, String.format("Error while retrieving known users from request: %s", error)));
   }

   private Instant now() {
      return ((TimeProvider)this.time.get()).getCurrentInstant();
   }
}
