package com.airlock.iam.common.infrastructure.rememberme;

import com.airlock.iam.base.api.domain.model.user.UserId;
import com.airlock.iam.base.misc.log.LogUtil;
import com.airlock.iam.common.application.service.rememberme.RememberMeConsistencyUserChangeService;
import com.airlock.iam.common.domain.service.rememberme.RememberMeCommonRepository;
import com.airlock.iam.elog.api.EDefaultLogType;
import com.airlock.iam.elog.api.ELogger;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.function.Consumer;

public class RememberMeConsistencyUserChangeServiceImpl implements RememberMeConsistencyUserChangeService {
   private final RememberMeCommonRepository repository;
   private final ELogger logger;
   private final Consumer<String> auditLogger;

   @Override
   public void delete(UserId userId) {
      try {
         int deletedTokens = this.repository.deleteBy(userId);
         if (deletedTokens > 0) {
            this.logger.info(String.format("Deleted %d Remember-Me tokens for user %s", deletedTokens, LogUtil.logSafeQuote(userId)));
         }
      } catch (RuntimeException e) {
         String message = "Could not delete Remember-Me token for " + LogUtil.logSafeQuote(userId) + ": ";
         this.logger.warn(EDefaultLogType.GENERIC_LOG_TYPE, message, e);
         this.auditLogger.accept(message + e.getMessage());
      }
   }

   @Override
   public void rename(UserId oldUserId, UserId newUserId) {
      this.repository.update(oldUserId, newUserId);
   }

   @SuppressFBWarnings(justification = "generated code")
   RememberMeConsistencyUserChangeServiceImpl(RememberMeCommonRepository repository, ELogger logger, Consumer<String> auditLogger) {
      this.repository = repository;
      this.logger = logger;
      this.auditLogger = auditLogger;
   }
}
