package com.airlock.iam.admin.application.service.user;

import com.airlock.iam.admin.api.domain.model.administrator.CurrentAdministrator;
import com.airlock.iam.base.api.domain.model.user.UserId;
import com.airlock.iam.log.api.signing.SigningLogger;
import com.airlock.iam.oauth2.domain.model.session.OAuth2GlobalSessionsRepository;
import com.airlock.iam.oauth2.domain.service.OAuth2TokenService;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.inject.Inject;
import jakarta.inject.Provider;

public class OAuth2AdminService {
   private final Provider<OAuth2TokenService> tokenService;
   private final Provider<SigningLogger> signingLogger;
   private final Provider<CurrentAdministrator> admin;
   private final Provider<OAuth2GlobalSessionsRepository> sessionRepository;

   @Inject
   public OAuth2AdminService(
      Provider<OAuth2TokenService> tokenService,
      Provider<SigningLogger> signingLogger,
      Provider<CurrentAdministrator> admin,
      Provider<OAuth2GlobalSessionsRepository> sessionRepository
   ) {
      this.tokenService = tokenService;
      this.signingLogger = signingLogger;
      this.admin = admin;
      this.sessionRepository = sessionRepository;
   }

   public int clearAllOAuth2TokensForUser(UserId userId) {
      int numberOfDeletedOAuth2Tokens = ((OAuth2GlobalSessionsRepository)this.sessionRepository.get()).deleteAllSessionsByUser(userId).getTokenCount();
      ((SigningLogger)this.signingLogger.get())
         .log(
            "Administrator %s deleted all %d OAuth 2.0 Tokens for user %s.",
            new Object[]{((CurrentAdministrator)this.admin.get()).getName(), numberOfDeletedOAuth2Tokens, userId}
         );
      return numberOfDeletedOAuth2Tokens;
   }

   public int getNumberOfOAuth2Tokens(UserId userId) {
      return ((OAuth2TokenService)this.tokenService.get()).getNumberOfOAuth2TokensForUser(userId);
   }

   @SuppressFBWarnings(justification = "generated code")
   public static OAuth2AdminService.OAuth2AdminServiceBuilder builder() {
      return new OAuth2AdminService.OAuth2AdminServiceBuilder();
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class OAuth2AdminServiceBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private Provider<OAuth2TokenService> tokenService;
      @SuppressFBWarnings(justification = "generated code")
      private Provider<SigningLogger> signingLogger;
      @SuppressFBWarnings(justification = "generated code")
      private Provider<CurrentAdministrator> admin;
      @SuppressFBWarnings(justification = "generated code")
      private Provider<OAuth2GlobalSessionsRepository> sessionRepository;

      @SuppressFBWarnings(justification = "generated code")
      OAuth2AdminServiceBuilder() {
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2AdminService.OAuth2AdminServiceBuilder tokenService(Provider<OAuth2TokenService> tokenService) {
         this.tokenService = tokenService;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2AdminService.OAuth2AdminServiceBuilder signingLogger(Provider<SigningLogger> signingLogger) {
         this.signingLogger = signingLogger;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2AdminService.OAuth2AdminServiceBuilder admin(Provider<CurrentAdministrator> admin) {
         this.admin = admin;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2AdminService.OAuth2AdminServiceBuilder sessionRepository(Provider<OAuth2GlobalSessionsRepository> sessionRepository) {
         this.sessionRepository = sessionRepository;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2AdminService build() {
         return new OAuth2AdminService(this.tokenService, this.signingLogger, this.admin, this.sessionRepository);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "OAuth2AdminService.OAuth2AdminServiceBuilder(tokenService="
            + this.tokenService
            + ", signingLogger="
            + this.signingLogger
            + ", admin="
            + this.admin
            + ", sessionRepository="
            + this.sessionRepository
            + ")";
      }
   }
}
