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.core.misc.impl.tokenverifier.oathotp.OtpCredBeanData;
import com.airlock.iam.core.misc.persistency.CredentialBean;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.flow.api.domain.model.session.FlowAttributeRepository;
import com.airlock.iam.flow.shared.domain.model.oath.OathOtpActivationStepSession;
import jakarta.inject.Inject;
import jakarta.inject.Provider;

public class FlowAttributeOathOtpPersistingService implements OathOtpPersistingService {
   private static final ELogger LOG = ELoggerFactory.getLogger(FlowAttributeOathOtpPersistingService.class);
   private final Provider<FlowAttributeRepository> flowAttributeRepository;

   @Inject
   public FlowAttributeOathOtpPersistingService(Provider<FlowAttributeRepository> repository) {
      this.flowAttributeRepository = repository;
   }

   @Override
   public void persist(UserId userId, CredentialBean credential) throws PersisterException {
      LOG.info("Saving OATH OTP data for user %s to persist in the persisting step.".formatted(LogUtil.logSafeQuote(userId)));
      OtpCredBeanData data = OtpCredBeanData.deserialize(credential.getInitializedCurrent().getStringData());
      ((FlowAttributeRepository)this.flowAttributeRepository.get()).putOrMergeAttribute(OathOtpActivationStepSession.oathOtpActivationStepSession(data));
   }
}
