package com.airlock.iam.publicselfservice.infrastructure.service.mtan;

import com.airlock.iam.base.api.domain.model.user.UserId;
import com.airlock.iam.common.domain.model.token.mtan.CommonMtanTokenRepository;
import com.airlock.iam.core.domain.model.token.TokenUsage;
import com.airlock.iam.core.misc.impl.authen.mtan.MtanHandler;
import com.airlock.iam.core.misc.impl.token.MtanItem;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.publicselfservice.domain.service.repository.PublicSelfServiceMtanTokenRepository;
import jakarta.inject.Inject;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Optional;

public class PublicSelfServiceMtanTokenRepositoryImpl implements PublicSelfServiceMtanTokenRepository {
   private static final ELogger LOG = ELoggerFactory.getLogger(PublicSelfServiceMtanTokenRepositoryImpl.class);
   private final CommonMtanTokenRepository commonMtanTokenRepository;

   @Inject
   public PublicSelfServiceMtanTokenRepositoryImpl(MtanHandler mtanHandler) {
      this.commonMtanTokenRepository = new CommonMtanTokenRepository(mtanHandler);
   }

   @Override
   public Optional<MtanItem> getMtanToken(UserId userId) {
      List<MtanItem> mtanTokens = this.commonMtanTokenRepository.getMtanTokens(userId);
      if (mtanTokens.isEmpty()) {
         return Optional.empty();
      }

      if (mtanTokens.size() > 1) {
         LOG.info("User has " + mtanTokens.size() + " mTAN tokens, selecting last used token.");
      }

      return mtanTokens.stream().max(Comparator.comparing(token -> token.getTokenUsage().map(TokenUsage::getMostRecentUsageDate).orElse(new Date(0L))));
   }
}
