package tc.oc.pgm.map;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.inject.Inject;
import javax.inject.Singleton;
import com.google.common.collect.Collections2;
import com.google.common.collect.ForwardingMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import org.bukkit.configuration.Configuration;
import org.bukkit.configuration.ConfigurationSection;
import tc.oc.commons.bukkit.configuration.ConfigUtils;
import tc.oc.commons.core.util.Holidays;
import static tc.oc.commons.core.util.Holidays.Holiday;
import static com.google.common.base.Preconditions.checkNotNull;
@Singleton
public class PGMMapEnvironment extends ForwardingMap<String, Boolean> {
private final ConfigurationSection config;
private final Map<String, Boolean> manual = new HashMap<>();
@Inject PGMMapEnvironment(Configuration config) {
this.config = checkNotNull(config.getConfigurationSection("environment"));
}
@Override
protected Map<String, Boolean> delegate() {
return manual;
}
public ConfigurationSection permanent() {
return config.getSection("permanent");
}
public boolean holidays() {
return config.getBoolean("holidays", true);
}
@Override
public Boolean get(Object objKey) {
String key = (String) objKey;
Boolean value = manual.get(key);
if(value != null) return value;
if(holidays()) {
Boolean holiday = null;
for(Holiday h : Holidays.all()) {
if(key.equals(h.key)) {
holiday = h.isNow();
break;
}
}
if(holiday != null) return holiday;
}
return permanent().getBoolean(key);
}
@Override
public Set<String> keySet() {
return Sets.union(Sets.union(manual.keySet(), Holidays.keys()), permanent().getKeys(false));
}
@Override
public Collection<Boolean> values() {
return Collections2.transform(keySet(), this::get);
}
@Override
public Set<Entry<String, Boolean>> entrySet() {
return ImmutableSet.copyOf(Collections2.transform(
keySet(),
key -> Maps.immutableEntry(key, get(key))
));
}
}