package com.airlock.iam.base.infrastructure.injection;

import com.airlock.iam.base.api.infrastructure.injection.SkipAutoRegistration;
import com.airlock.iam.base.api.infrastructure.plugin.ModuleForConfig;
import com.airlock.iam.base.infrastructure.reflection.ReflectionHelper;
import com.google.inject.Module;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.lang.reflect.Modifier;
import java.util.Collection;
import java.util.List;

public final class GuiceModules {
   private final Collection<Class<? extends Module>> modulesFromClasspath;

   public List<Module> getGuiceModules() {
      return this.modulesFromClasspath
         .stream()
         .filter(cls -> !cls.isAnnotationPresent(ModuleForConfig.class))
         .filter(cls -> !cls.isAnnotationPresent(SkipAutoRegistration.class))
         .filter(clazz -> !Modifier.isAbstract(clazz.getModifiers()))
         .map(clazz -> ReflectionHelper.newInstance((Class<? extends Module>)clazz))
         .map(Module.class::cast)
         .toList();
   }

   public List<Class<? extends Module>> getModulesTypesForPluginConfig() {
      return this.modulesFromClasspath.stream().filter(cls -> cls.isAnnotationPresent(ModuleForConfig.class)).toList();
   }

   @SuppressFBWarnings(justification = "generated code")
   public GuiceModules(Collection<Class<? extends Module>> modulesFromClasspath) {
      this.modulesFromClasspath = modulesFromClasspath;
   }
}
