package com.airlock.iam.common.domain.service.rememberme;

import com.airlock.iam.base.api.domain.model.user.UserId;
import com.airlock.iam.base.misc.log.LogUtil;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Optional;

public final class RememberMeTokenServiceImpl implements RememberMeTokenService {
   private final Provider<Optional<RememberMeCommonRepository>> repository;
   private final Provider<RememberMeTokenServiceSettings> settings;
   private final ELogger logger;

   @Inject
   public RememberMeTokenServiceImpl(Provider<Optional<RememberMeCommonRepository>> repository, Provider<RememberMeTokenServiceSettings> settings) {
      this(repository, settings, ELoggerFactory.getLogger(RememberMeTokenServiceImpl.class));
   }

   RememberMeTokenServiceImpl(Provider<Optional<RememberMeCommonRepository>> repository, Provider<RememberMeTokenServiceSettings> settings, ELogger logger) {
      this.repository = repository;
      this.settings = settings;
      this.logger = logger;
   }

   @Override
   public void handlePasswordChange(UserId userId) {
      if (((RememberMeTokenServiceSettings)this.settings.get()).removeRememberMeTokensOnPasswordChanges()) {
         this.deleteAndLogAction(userId, "a password change");
      }
   }

   @Override
   public void handleUserLocked(UserId userId) {
      if (((RememberMeTokenServiceSettings)this.settings.get()).removeRememberMeTokensOnUserLocked()) {
         this.deleteAndLogAction(userId, "the user being locked");
      }
   }

   private void deleteAndLogAction(UserId userId, String logReason) {
      ((Optional)this.repository.get())
         .ifPresent(
            commonRepository -> {
               int deletedTokens = commonRepository.deleteBy(userId);
               if (deletedTokens > 0) {
                  this.logger
                     .info(String.format("Deleted %d Remember-Me tokens for user %s as a result of %s", deletedTokens, LogUtil.logSafeQuote(userId), logReason));
               }
            }
         );
   }
}
