package com.airlock.iam.oauth2.domain.service;

import com.airlock.iam.base.api.domain.model.exception.FailureException;
import com.airlock.iam.base.api.domain.model.user.UserId;
import com.airlock.iam.common.api.domain.model.persistency.exception.PersisterException;
import com.airlock.iam.core.misc.persistency.token.TokenBean;
import com.airlock.iam.core.misc.persistency.token.TokenDataProvider;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import jakarta.inject.Inject;
import java.util.List;
import lombok.NonNull;

public class OAuth2TokenService {
   private static final ELogger LOG = ELoggerFactory.getLogger(OAuth2TokenService.class);
   @NonNull
   private final TokenDataProvider tokenDataProvider;

   @Inject
   public OAuth2TokenService(@NonNull TokenDataProvider tokenDataProvider) {
      if (tokenDataProvider == null) {
         throw new NullPointerException("tokenDataProvider is marked non-null but is null");
      }

      this.tokenDataProvider = tokenDataProvider;
   }

   public int getNumberOfOAuth2TokensForUser(UserId userId) {
      TokenDataProvider.TokenFilter filter = OAuth2TokenFilterFactory.oAuth2TokenFilter().filterSingleUser(userId.getValue());

      try {
         List<TokenBean> matchingTokens = this.tokenDataProvider.get(filter);
         int numberOfTokens = matchingTokens.size();
         LOG.debug("Found " + numberOfTokens + " OAuth 2.0 Tokens for user '" + userId + "'");
         return numberOfTokens;
      } catch (PersisterException e) {
         throw new FailureException(e);
      }
   }
}
