package de.nedelosk.modularmachines.api.modules.storage.module;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Nonnull;

import de.nedelosk.modularmachines.api.modules.IModule;
import de.nedelosk.modularmachines.api.modules.controller.IModuleControl;
import de.nedelosk.modularmachines.api.modules.controller.IModuleControlled;
import de.nedelosk.modularmachines.api.modules.state.IModuleState;

public class ModuleHandler implements IModuleHandler {

	protected final IModuleStorage defaultStorage;
	protected final IModuleState state;
	protected final IModuleControl control;

	public ModuleHandler(@Nonnull IModuleStorage defaultStorage, @Nonnull IModuleState state) {
		this.defaultStorage = defaultStorage;
		this.state = state;
		if(state.getModule() instanceof IModuleControlled){
			this.control = ((IModuleControlled) state.getModule()).getModuleControl(state);
		}else{
			this.control = null;
		}
	}

	@Override
	public <M extends IModule> List<IModuleState<M>> getModules(Class<? extends M> moduleClass) {
		List<IModuleState<M>> modules = new ArrayList<>();
		List<IModuleState<M>> defaultModules = defaultStorage.getModules(moduleClass);
		if(control != null) {
			for(IModuleState<M> state : defaultModules){
				if(control.hasPermission(state)){
					modules.add(state);
				}
			}
		}
		return modules;
	}

	@Override
	public List<IModuleState> getModules() {
		List<IModuleState> modules = new ArrayList<>();
		if(control != null){
			for(IModuleState state : defaultStorage.getModules()){
				if(control.hasPermission(state)){
					modules.add(state);
				}
			}
		}
		return modules;
	}

	@Override
	public <M extends IModule> IModuleState<M> getModule(int index) {
		IModuleState<M> module = defaultStorage.getModule(index);
		if(control != null && control.hasPermission(module)){
			return module;
		}
		return null;
	}

	@Override
	public <M extends IModule> IModuleState<M> getModule(Class<? extends M> moduleClass) {
		IModuleState<M> module = defaultStorage.getModule(moduleClass);
		if(control != null && control.hasPermission(module)){
			return module;
		}
		return null;
	}

	@Override
	public IModuleState getState() {
		return state;
	}

	@Override
	public IModuleStorage getDefaultStorage() {
		return defaultStorage;
	}
}

@@ -86,16 +86,46 @@
 ayList;%0A
+import java.util.Collections;%0A
 import j
@@ -230,16 +230,91 @@
 Module;%0A
+import de.nedelosk.modularmachines.api.modules.containers.IModuleProvider;%0A
 import d
@@ -2381,11 +2381,107 @@
 rage;%0A%09%7D
+%0A%0A%09@Override%0A%09public List%3CIModuleProvider%3E getProviders() %7B%0A%09%09return Collections.emptyList();%0A%09%7D
 %0A%7D%0A

Fix .jar