package net.viper.status.module;

import net.md_5.bungee.api.plugin.Plugin;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * Verwaltet alle geladenen Module.
 * Verwendet LinkedHashMap um die Registrierungsreihenfolge zu erhalten,
 * damit Abh\u00e4ngigkeiten (z.B. VanishModule → ChatModule) korrekt aufgel\u00f6st werden.
 */
public class ModuleManager {

    private final Map<String, Module> modules = new LinkedHashMap<>();

    public void registerModule(Module module) {
        modules.put(module.getName().toLowerCase(), module);
    }

    public void enableAll(Plugin plugin) {
        for (Module module : modules.values()) {
            try {
                module.onEnable(plugin);
            } catch (Exception e) {
                plugin.getLogger().severe("Fehler beim Aktivieren von Modul " + module.getName() + ": " + e.getMessage());
                e.printStackTrace();
            }
        }
    }

    public void disableAll(Plugin plugin) {
        for (Module module : modules.values()) {
            try {
                module.onDisable(plugin);
            } catch (Exception e) {
                plugin.getLogger().warning("Fehler beim Deaktivieren von Modul " + module.getName());
            }
        }
        modules.clear();
    }

    /**
     * Erm\u00f6glicht anderen Komponenten (wie dem WebServer) Zugriff auf spezifische Module.
     */
    public Module getModule(String name) {
        return modules.get(name.toLowerCase());
    }

    /**
     * Ersetzt ein bestehendes Modul durch eine neue Instanz (f\u00fcr Reload).
     * Das alte Modul muss bereits deaktiviert worden sein.
     */
    public void replaceModule(String name, Module newModule) {
        modules.put(name.toLowerCase(), newModule);
    }

    @SuppressWarnings("unchecked")
    public <T extends Module> T getModule(Class<T> clazz) {
        for (Module m : modules.values()) {
            if (clazz.isInstance(m)) {
                return (T) m;
            }
        }
        return null;
    }
}
