package joshie.progression.handlers;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import joshie.progression.api.criteria.*;
import java.util.*;
import java.util.concurrent.Callable;
public class APICache {
private final Cache<Boolean, ArrayList<ITab>> sortedCache = CacheBuilder.newBuilder().maximumSize(1).build();
private final HashMap<UUID, IRewardProvider> rewardCache = new HashMap();
private final HashMap<UUID, ITriggerProvider> triggerCache = new HashMap();
private final HashMap<UUID, IConditionProvider> conditionCache = new HashMap();
private final HashMap<UUID, ICriteria> criteriaCache = new HashMap();
private final HashMap<UUID, ITab> tabCache = new HashMap();
//Instances
public static APICache serverCache;
public static APICache clientCache;
public static void resetAPIHandler(boolean isClient) {
if (isClient) {
clientCache = new APICache();
} else serverCache = new APICache();
}
public static APICache getClientCache() {
return clientCache;
}
public static APICache getServerCache() {
return serverCache;
}
public static APICache getCache(boolean isClient) {
return isClient ? getClientCache() : getServerCache();
}
public IRewardProvider getRewardFromUUID(final UUID uuid) {
return rewardCache.get(uuid);
}
public ITriggerProvider getTriggerFromUUID(final UUID uuid) {
return triggerCache.get(uuid);
}
public IConditionProvider getConditionFromUUID(final UUID uuid) {
return conditionCache.get(uuid);
}
public void addReward(IRewardProvider reward) {
rewardCache.put(reward.getUniqueID(), reward);
}
public ITriggerProvider addTrigger(ITriggerProvider trigger) {
triggerCache.put(trigger.getUniqueID(), trigger);
return trigger;
}
public IConditionProvider addCondition(IConditionProvider condition) {
conditionCache.put(condition.getUniqueID(), condition);
return condition;
}
public ICriteria addCriteria(ICriteria criteria) {
criteriaCache.put(criteria.getUniqueID(), criteria);
return criteria;
}
public void removeCriteria(ICriteria criteria) {
criteriaCache.remove(criteria.getUniqueID());
}
public ICriteria getCriteria(UUID uuid) {
return criteriaCache.get(uuid);
}
public Collection<ICriteria> getCriteriaSet() {
return criteriaCache.values();
}
public ITab getTab(UUID uuid) {
return tabCache.get(uuid);
}
public Collection<ITab> getTabSet() {
return tabCache.values();
}
public Set<UUID> getTabIDs() {
return tabCache.keySet();
}
public void clearSorted() {
sortedCache.invalidateAll();
}
public ITab addTab(ITab tab) {
tabCache.put(tab.getUniqueID(), tab);
clearSorted();
return tab;
}
public void removeTab(ITab tab) {
tabCache.remove(tab.getUniqueID());
clearSorted();
}
public ArrayList<ITab> getSortedTabs() {
try {
return sortedCache.get(true, new Callable<ArrayList<ITab>>() {
@Override
public ArrayList<ITab> call() throws Exception {
ArrayList<ITab> tabs = new ArrayList(tabCache.values());
Collections.sort(tabs, new SortIndex());
return tabs;
}
});
} catch (Exception e) { return new ArrayList(); }
}
public ICriteria getRandomCriteria() {
List<ICriteria> criteria = new ArrayList<ICriteria>(criteriaCache.values());
if (criteria.size() > 0) {
Collections.shuffle(criteria);
return criteria.get(0);
} else return null;
}
private static class SortIndex implements Comparator {
@Override
public int compare(Object o1, Object o2) {
ITab tab1 = ((ITab) o1);
ITab tab2 = ((ITab) o2);
if (tab1.getSortIndex() == tab2.getSortIndex()) {
return tab1.getLocalisedName().compareTo(tab2.getLocalisedName());
}
return tab1.getSortIndex() < tab2.getSortIndex() ? 1 : -1;
}
}
}