package tc.oc.pgm.quota;
import java.util.NavigableSet;
import java.util.TreeSet;
import javax.annotation.Nullable;
import javax.inject.Inject;
import com.google.common.base.Function;
import com.google.common.collect.Collections2;
import com.google.common.collect.Range;
import org.bukkit.configuration.Configuration;
import org.bukkit.configuration.ConfigurationSection;
import java.time.Duration;
import tc.oc.commons.bukkit.configuration.ConfigUtils;
import tc.oc.pgm.match.MatchPlayer;
public class QuotaConfig {
private final @Nullable ConfigurationSection config;
private final NavigableSet<Entry> quotas;
@Inject QuotaConfig(Configuration root) {
this.config = root.getConfigurationSection("match-quotas");
if(config == null) {
quotas = new TreeSet<>();
} else {
quotas = new TreeSet<>(Collections2.transform(
config.getKeys(false),
new Function<String, Entry>() {
@Override
public Entry apply(@Nullable String key) {
return new Entry(config.getConfigurationSection(key));
}
}
));
}
}
public Iterable<? extends Quota> getQuotas() {
return quotas;
}
public @Nullable Range<Integer> getPremiumMaximum() {
int min = Integer.MAX_VALUE, max = Integer.MIN_VALUE;
for(Quota quota : getQuotas()) {
if(quota.premium()) {
min = Math.min(min, quota.maximum());
max = Math.max(max, quota.maximum());
}
}
return min <= max ? Range.closed(min, max) : null;
}
private class Entry implements Quota, Comparable<Entry> {
private final ConfigurationSection config;
private Entry(ConfigurationSection config) {
this.config = config;
validate();
}
public void validate() {
priority();
interval();
maximum();
}
@Override
public int priority() {
return config.getInt("priority");
}
@Override
public int compareTo(Entry o) {
return Integer.compare(priority(), o.priority());
}
private @Nullable String permission() {
return config.getString("permission");
}
@Override
public boolean appliesTo(MatchPlayer player) {
String perm = permission();
return perm == null || player.getBukkit().hasPermission(perm);
}
@Override
public Duration interval() {
return ConfigUtils.getDuration(config, "interval");
}
@Override
public int maximum() {
int max = config.getInt("max");
if(max < 1) throw new IllegalArgumentException("Quota max must be at least 1");
return max;
}
@Override
public boolean premium() {
return config.getBoolean("premium", false);
}
}
}