package com.airlock.iam.admin.infrastructure.factory.prot;

import com.airlock.iam.admin.domain.model.token.TokenController;
import com.airlock.iam.admin.domain.model.user.UserSpecificSettings;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import com.google.inject.servlet.RequestScoped;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
import java.util.stream.Collectors;

public class TokenControllersModule extends PrivateModule {
   @RequestScoped
   @Provides
   @Exposed
   TokenController.TokenControllers provideTokenControllers(UserSpecificSettings settings) {
      return new TokenControllersModule.AdminappTokenControllers(settings);
   }

   protected void configure() {
   }

   private static final class AdminappTokenControllers implements TokenController.TokenControllers {
      private final UserSpecificSettings settings;
      private Map<String, TokenController> controllers;

      AdminappTokenControllers(UserSpecificSettings settings) {
         this.settings = settings;
      }

      @Override
      public <T extends TokenController> Optional<T> ofId(String id) {
         if (this.controllers == null) {
            this.controllers = this.createControllers();
         }

         return Optional.ofNullable((T)this.controllers.get(id));
      }

      private Map<String, TokenController> createControllers() {
         List<TokenController> tokenControllers = this.settings.getTokenControllers();
         return tokenControllers.stream().collect(Collectors.toMap(TokenController::getTokenControllerId, Function.identity()));
      }
   }
}
