package jas.spawner.refactor;
import jas.spawner.refactor.configsloader.ConfigLoader;
import jas.spawner.refactor.configsloader.ConfigLoader.LoadedFile;
import jas.spawner.refactor.configsloader.LivingHandlerLoader;
import jas.spawner.refactor.configsloader.LivingSettingsLoader;
import jas.spawner.refactor.entities.Group.ReversibleGroups;
import jas.spawner.refactor.entities.ImmutableMapGroupsBuilder;
import jas.spawner.refactor.entities.ListContentGroup;
import jas.spawner.refactor.entities.LivingAttributes;
import jas.spawner.refactor.entities.LivingGroupBuilder;
import jas.spawner.refactor.entities.LivingGroupBuilder.LivingGroup;
import jas.spawner.refactor.entities.LivingHandlerBuilder;
import jas.spawner.refactor.entities.LivingHandlerBuilder.LivingHandler;
import jas.spawner.refactor.entities.LivingMappings;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
import net.minecraft.world.World;
import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ImmutableListMultimap.Builder;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMultimap;
public class LivingHandlers implements ReversibleGroups<LivingHandler> {
/* Mapping from GroupID to LivingHandler */
private ImmutableMap<String, LivingHandler> livingHandlers;
private ImmutableListMultimap<String, String> mappingToGroupID;
public LivingHandler getLivingHandler(String handlerID) {
return livingHandlers.get(handlerID);
}
public static String key = "G|";
@Override
public String key() {
return key;
}
@Override
public Map<String, LivingHandler> iDToGroup() {
return livingHandlers;
}
@Override
public ImmutableMultimap<String, String> mappingToID() {
return mappingToGroupID;
}
public LivingHandlers(ConfigLoader loader, LivingMappings mappings, LivingAttributes attributes) {
loadFromConfig(loader, mappings, attributes);
}
public void loadFromConfig(ConfigLoader loader, LivingMappings mappings, LivingAttributes attributes) {
ImmutableMapGroupsBuilder<LivingHandlerBuilder> livingBuilders = new ImmutableMapGroupsBuilder<LivingHandlerBuilder>(
key);
for (Entry<String, LoadedFile<LivingHandlerLoader>> entry : loader.livingHandlerLoaders.entrySet()) {
LivingHandlerLoader handlerLoader = entry.getValue().saveObject;
if (handlerLoader.getHandlers().isPresent()) {
for (LivingHandlerBuilder builder : handlerLoader.getHandlers().get()) {
if (builder.getLivingHandlerID() != null && !builder.getLivingHandlerID().trim().equals("")) {
livingBuilders.addGroup(builder);
}
}
}
}
/* Add new mappings as LivingHandler */
for (String mapping : mappings.newMappings()) {
livingBuilders.addGroup(new LivingHandlerBuilder(mapping));
}
ImmutableMapGroupsBuilder<LivingHandler> livingHandlers = new ImmutableMapGroupsBuilder<LivingHandler>(key);
Builder<String, String> mappingToGroupIDBuilder = ImmutableListMultimap.<String, String> builder();
for (LivingHandlerBuilder builder : livingBuilders.iDToGroup().values()) {
ListContentGroup.Parser.parseGroupContents(builder, mappings, attributes);
livingHandlers.addGroup(builder.build());
for (String mapping : builder.results()) {
mappingToGroupIDBuilder.put(mapping, builder.iD());
}
}
this.livingHandlers = livingHandlers.build();
this.mappingToGroupID = mappingToGroupIDBuilder.build();
}
public void saveToConfig(WorldProperties worldProperties, ConfigLoader loader, LivingMappings mappings,
LivingAttributes attributes) {
Collection<LivingGroupBuilder> livGrpBuilders = new ArrayList<LivingGroupBuilder>();
for (LivingGroup attribute : attributes.iDToGroup().values()) {
livGrpBuilders.add(new LivingGroupBuilder(attribute));
}
loader.livingGroupLoader = new LoadedFile(new LivingSettingsLoader(mappings.keyToMapping(), livGrpBuilders));
Map<String, Collection<LivingHandlerBuilder>> fileNameToLivingHandlers = new HashMap<String, Collection<LivingHandlerBuilder>>();
for (LivingHandler handler : livingHandlers.values()) {
String saveName = getSaveFileName(worldProperties, handler.livingHandlerID);
Collection<LivingHandlerBuilder> idToHandler = fileNameToLivingHandlers.get(saveName);
if (idToHandler == null) {
idToHandler = new HashSet<LivingHandlerBuilder>();
fileNameToLivingHandlers.put(saveName, idToHandler);
}
idToHandler.add(new LivingHandlerBuilder(handler));
}
Map<String, LoadedFile<LivingHandlerLoader>> livingHandlerLoaders = new HashMap<String, LoadedFile<LivingHandlerLoader>>();
loader.livingHandlerLoaders = new HashMap<String, ConfigLoader.LoadedFile<LivingHandlerLoader>>();
for (String fileName : fileNameToLivingHandlers.keySet()) {
loader.livingHandlerLoaders.put(fileName, new LoadedFile<LivingHandlerLoader>(new LivingHandlerLoader(
fileNameToLivingHandlers.get(fileName))));
}
}
private String getSaveFileName(WorldProperties worldProperties, String groupID) {
boolean universalCFG = worldProperties.getSavedFileConfiguration().universalDirectory;
if (universalCFG) {
return "Universal";
} else {
return LivingHelper.guessModID(groupID);
}
}
}