package jk_5.nailed.server.mappack;
import com.google.common.collect.ImmutableList;
import jk_5.nailed.api.event.mappack.MappackRegisteredEvent;
import jk_5.nailed.api.event.mappack.MappackUnregisteredEvent;
import jk_5.nailed.api.event.mappack.RegisterMappacksEvent;
import jk_5.nailed.api.mappack.Mappack;
import jk_5.nailed.api.mappack.MappackRegistry;
import jk_5.nailed.server.NailedEventFactory;
import jk_5.nailed.server.map.NailedMapLoader;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.*;
public class NailedMappackRegistry implements MappackRegistry {
private static final NailedMappackRegistry INSTANCE = new NailedMappackRegistry();
private static final Logger logger = LogManager.getLogger();
private final Map<String, Mappack> mappacks = new HashMap<String, Mappack>();
@Override
public boolean register(@Nonnull Mappack mappack) {
if(mappacks.containsKey(mappack.getId()) || mappacks.containsValue(mappack)){
return false;
}
this.mappacks.put(mappack.getId(), mappack);
NailedEventFactory.fireEvent(new MappackRegisteredEvent(mappack));
return true;
}
@Nullable
@Override
public Mappack getByName(@Nonnull String name) {
return this.mappacks.get(name);
}
@Nonnull
@Override
public <T> Collection<T> getByType(@Nonnull Class<? extends T> cl) {
List<T> ret = new ArrayList<T>();
for (Mappack mappack : this.mappacks.values()) {
if(cl.isAssignableFrom(mappack.getClass())){
ret.add((T) mappack);
}
}
return ret;
}
@Nonnull
@Override
public Collection<Mappack> getAll() {
return ImmutableList.copyOf(this.mappacks.values());
}
@Nonnull
@Override
public Collection<String> getAllIds() {
return ImmutableList.copyOf(this.mappacks.keySet());
}
@Override
public boolean unregister(@Nonnull Mappack mappack) {
if(!mappacks.containsKey(mappack.getId()) && !mappacks.containsValue(mappack)){
return false;
}
this.mappacks.remove(mappack.getId());
NailedEventFactory.fireEvent(new MappackUnregisteredEvent(mappack));
return true;
}
public void reload(){
logger.info("Reloading mappacks");
mappacks.clear();
NailedEventFactory.fireEvent(new RegisterMappacksEvent(this, NailedMapLoader.instance()));
}
public static NailedMappackRegistry instance(){
return INSTANCE;
}
}