package com.airlock.iam.common.infrastructure;

import com.airlock.iam.common.infrastructure.event.EventSubscribers;
import com.airlock.iam.common.infrastructure.plugin.PluginRepository;
import com.airlock.iam.log.api.helpdesk.HelpdeskLogger;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import jakarta.inject.Inject;
import jakarta.inject.Singleton;
import jakarta.ws.rs.container.ContainerRequestContext;
import jakarta.ws.rs.container.ResourceInfo;
import jakarta.ws.rs.core.SecurityContext;
import jakarta.ws.rs.core.UriInfo;
import ma.glasnost.orika.MapperFacade;
import org.glassfish.jersey.internal.inject.InjectionManager;
import org.glassfish.jersey.server.ExtendedUriInfo;

public class JerseyModule extends PrivateModule {
   private final InjectionManager injectionManager;

   @Inject
   public JerseyModule(InjectionManager injectionManager) {
      this.injectionManager = injectionManager;
   }

   @Provides
   @Exposed
   InjectionManager injectionManager() {
      return this.injectionManager;
   }

   @Provides
   @Exposed
   SecurityContext securityContext() {
      return (SecurityContext)this.injectionManager.getInstance(SecurityContext.class);
   }

   @Provides
   @Exposed
   UriInfo uriInfo() {
      return (UriInfo)this.injectionManager.getInstance(UriInfo.class);
   }

   @Provides
   @Exposed
   ExtendedUriInfo extendedUriInfo() {
      return (ExtendedUriInfo)this.injectionManager.getInstance(ExtendedUriInfo.class);
   }

   @Provides
   @Exposed
   ResourceInfo resourceInfo() {
      return (ResourceInfo)this.injectionManager.getInstance(ResourceInfo.class);
   }

   @Provides
   @Exposed
   MapperFacade mapperFacade() {
      return (MapperFacade)this.injectionManager.getInstance(MapperFacade.class);
   }

   @Provides
   @Exposed
   HelpdeskLogger helpdeskLogger() {
      return (HelpdeskLogger)this.injectionManager.getInstance(HelpdeskLogger.class);
   }

   @Provides
   @Exposed
   ContainerRequestContext containerRequestContext() {
      return (ContainerRequestContext)this.injectionManager.getInstance(ContainerRequestContext.class);
   }

   @Provides
   @Exposed
   @Singleton
   public EventSubscribers eventSubscribers() {
      return (EventSubscribers)this.injectionManager.getInstance(EventSubscribers.class);
   }

   @Provides
   @Exposed
   @Singleton
   public PluginRepository pluginRepository() {
      return (PluginRepository)this.injectionManager.getInstance(PluginRepository.class);
   }

   protected void configure() {
   }
}
