package jk_5.nailed.server.map.stat;
import com.google.common.collect.ImmutableList;
import jk_5.nailed.api.map.Map;
import jk_5.nailed.api.map.stat.*;
import jk_5.nailed.api.mappack.metadata.StatConfig;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.Collections;
import java.util.List;
public class NailedStatManager implements StatManager {
private final Map map;
private final List<Stat> stats;
public NailedStatManager(Map map) {
this.map = map;
if(map.mappack() != null){
ImmutableList.Builder<Stat> builder = ImmutableList.builder();
for (StatConfig config : map.mappack().getMetadata().stats()) {
if(config.track() == null || config.track().isEmpty()){
builder.add(new ModifiableStat(config.name()));
}else{
builder.add(new SubscribedStat(config.name(), config.track(), config.attributes()));
}
}
stats = builder.build();
}else{
this.stats = Collections.emptyList();
}
}
public void fireEvent(StatEvent event){
for (Stat stat : stats) {
if(stat instanceof SubscribedStat){
SubscribedStat s = (SubscribedStat) stat;
if(s.getTrack().equals(event.getName())){
boolean matches = true;
for (java.util.Map.Entry<String, String> entry : event.getAttributes().entrySet()) {
if(!s.getAttributes().get(entry.getKey()).equals(entry.getValue())){
matches = false;
break;
}
}
if(!matches){ //TODO: this check was missing. Is it really needed?
s.onEvent(event);
}
}
}
}
}
@Nullable
public Stat getStat(@Nonnull String name){
for (Stat stat : this.stats) {
if(stat.getName().equals(name)){
return stat;
}
}
return null;
}
}