package net.obnoxint.mcdev.feature;
import java.util.HashMap;
import net.obnoxint.mcdev.feature.event.FeatureActiveStateChangedEvent;
import net.obnoxint.mcdev.feature.event.FeatureAddedEvent;
import net.obnoxint.mcdev.feature.event.FeatureRemovedEvent;
import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin;
public abstract class FeatureManager implements Feature {
private final HashMap<String, Feature> features = new HashMap<>();
private String name = null;
private final Plugin plugin;
public FeatureManager(final Plugin plugin) {
if (plugin == null) {
throw new NullPointerException();
}
this.plugin = plugin;
}
@Override
public String getFeatureName() {
if (name == null) {
name = getFeaturePlugin().getName() + ".features";
}
return name;
}
@Override
public Plugin getFeaturePlugin() {
return plugin;
}
@Override
public void setFeatureActive(final boolean active) {
for (final Feature f : getFeatures().values()) {
if (active != f.isFeatureActive()) {
f.setFeatureActive(active);
Bukkit.getPluginManager().callEvent(new FeatureActiveStateChangedEvent(this, f, active));
}
}
}
protected boolean addFeature(final Feature feature) {
if (!getFeatures().containsKey(feature.getFeatureName())) {
features.put(feature.getFeatureName(), feature);
Bukkit.getPluginManager().callEvent(new FeatureAddedEvent(this, feature));
return true;
}
return false;
}
protected Feature getFeature(final String name) {
return getFeatures().get(name);
}
protected final HashMap<String, Feature> getFeatures() {
return new HashMap<>(features);
}
protected boolean removeFeature(final Feature feature) {
final boolean r = features.remove(feature.getFeatureName()) != null;
if (r) {
Bukkit.getPluginManager().callEvent(new FeatureRemovedEvent(this, feature));
}
return r;
}
protected String setFeatureName(final String name) {
if (this.name == null && name != null && !name.trim().isEmpty()) {
this.name = name.trim();
}
return this.name;
}
}