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

import com.airlock.iam.base.api.domain.model.user.UserId;
import com.airlock.iam.base.misc.log.LogUtil;
import com.airlock.iam.common.api.domain.model.persistency.exception.PersisterException;
import com.airlock.iam.common.domain.model.event.OathOtpDeviceActivatedEventFactory;
import com.airlock.iam.core.misc.persistency.CredentialBean;
import com.airlock.iam.core.misc.persistency.CredentialPersister;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.log.api.helpdesk.HelpdeskLogger;
import jakarta.inject.Inject;
import jakarta.inject.Provider;

public class ImmediateOathOtpPersistingService implements OathOtpPersistingService {
   private static final ELogger LOG = ELoggerFactory.getLogger(ImmediateOathOtpPersistingService.class);
   private final Provider<CredentialPersister> credentialPersister;
   private final Provider<OathOtpDeviceActivatedEventFactory> eventFactory;
   private final Provider<HelpdeskLogger> helpdeskLogger;

   @Inject
   public ImmediateOathOtpPersistingService(
      Provider<CredentialPersister> credentialPersister, Provider<OathOtpDeviceActivatedEventFactory> eventFactory, Provider<HelpdeskLogger> helpdeskLogger
   ) {
      this.credentialPersister = credentialPersister;
      this.eventFactory = eventFactory;
      this.helpdeskLogger = helpdeskLogger;
   }

   @Override
   public void persist(UserId userId, CredentialBean credential) throws PersisterException {
      LOG.info("Persisting OATH OTP shared secret for user %s.".formatted(LogUtil.logSafeQuote(userId)));
      ((CredentialPersister)this.credentialPersister.get()).makeCredentialPersistent(userId.getValue(), credential);
      ((OathOtpDeviceActivatedEventFactory)this.eventFactory.get()).publishOathOtpNewSecretActivatedEvent(userId);
      ((HelpdeskLogger)this.helpdeskLogger.get()).log(userId, "A new OATH OTP device has been registered.");
   }
}
