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

import com.airlock.iam.base.misc.log.LogUtil;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.oauth2.domain.model.session.OAuth2ExtendedSession;
import com.airlock.iam.oauth2.domain.model.session.OAuth2ExtendedSessionRepository;
import com.airlock.iam.oauth2.domain.model.session.OAuth2SessionClaims;
import com.airlock.iam.oauth2.domain.model.session.OAuth2SessionId;
import com.airlock.iam.oauth2.domain.service.OAuth2GrantsSessionService;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Optional;

public final class OAuth2GrantsSessionServiceImpl implements OAuth2GrantsSessionService {
   private static final ELogger LOG = ELoggerFactory.getLogger(OAuth2GrantsSessionServiceImpl.class);
   private final Provider<OAuth2ExtendedSessionRepository> oauth2ExtendedSessionRepository;

   @Inject
   public OAuth2GrantsSessionServiceImpl(Provider<OAuth2ExtendedSessionRepository> oauth2ExtendedSessionRepository) {
      this.oauth2ExtendedSessionRepository = oauth2ExtendedSessionRepository;
   }

   @Override
   public void createOAuth2Session(OAuth2ExtendedSession session) {
      ((OAuth2ExtendedSessionRepository)this.oauth2ExtendedSessionRepository.get()).insert(session);
   }

   @Override
   public Optional<OAuth2SessionClaims> getSessionClaims(OAuth2SessionId sessionId) {
      return ((OAuth2ExtendedSessionRepository)this.oauth2ExtendedSessionRepository.get()).getAccessAndIdTokenClaims(sessionId);
   }

   @Override
   public void deleteOAuth2Session(OAuth2SessionId sessionId) {
      if (((OAuth2ExtendedSessionRepository)this.oauth2ExtendedSessionRepository.get()).delete(sessionId)) {
         LOG.debug("Deleted OAuth 2.0 session " + LogUtil.logSafeString(sessionId.getId()));
      } else {
         LOG.debug("OAuth 2.0 session " + LogUtil.logSafeString(sessionId.getId()) + " not found for deletion, ignoring.");
      }
   }
}
