package de.tobiyas.racesandclasses.standalonegui.data;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import de.tobiyas.racesandclasses.standalonegui.data.option.TraitConfigOption;
import de.tobiyas.racesandclasses.standalonegui.data.option.specific.TraitConfigStringOption;
import de.tobiyas.util.config.YAMLConfigExtended;
public class GuiClass implements Comparable<GuiClass>, NeedsSave {
/**
* The Traits of the Class
*/
private final Set<GuiTrait> traits = new HashSet<GuiTrait>();
/**
* The Name of the Class
*/
private String className = "NONE";
/**
* The NodeName of the Class
*/
private String classNodeName = "NONE";
/**
* The Config to use.
*/
private final List<TraitConfigOption> config = new LinkedList<TraitConfigOption>();
/**
* The Config to use for re-Sereializing.
*/
private final YAMLConfigExtended ymlConfig;
/**
* If we currently need save.
*/
private boolean needsSave = false;
public GuiClass(YAMLConfigExtended ymlConfig, String name, String nodeName, String tag, String manaBonus, String armor, Set<GuiTrait> traits) {
this.ymlConfig = ymlConfig;
this.traits.addAll(traits);
this.classNodeName = nodeName;
this.className = name;
for(GuiTrait trait : traits) trait.setBelongingClass(this);
//setting the config.
this.config.add(new TraitConfigStringOption("name", true, className));
this.config.add(new TraitConfigStringOption("manaBonus", false, manaBonus));
this.config.add(new TraitConfigStringOption("tag", true, tag));
Collections.sort(config);
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
this.needsSave = true;
}
public String getClassNodeName() {
return classNodeName;
}
public void setClassNodeName(String classNodeName) {
this.classNodeName = classNodeName;
this.needsSave = true;
}
/**
* Saves to YML file.
*/
public void save(){
if(!needsSave()) return;
//First clear the config.
ymlConfig.clearConfig();
//second save config!
for( TraitConfigOption option : config ){
ymlConfig.set(classNodeName + ".config." + option.getName(), option.getCurrentSelection());
}
//Last save the Traits:
for( GuiTrait trait : traits ){
trait.saveTo(ymlConfig, classNodeName + ".traits.");
}
ymlConfig.save();
this.needsSave = false;
}
@Override
public boolean needsSave() {
if( needsSave ) return true;
for(GuiTrait trait : traits){
if(trait.needsSave()) return true;
}
for( TraitConfigOption option : config ){
if(option.needsSave()) return true;
}
return false;
}
public Set<GuiTrait> getTraits() {
return traits;
}
public void addTrait(GuiTrait trait) {
trait.setBelongingClass(this);
traits.add(trait);
this.needsSave = true;
}
public void removeTrait(GuiTrait trait) {
traits.remove(trait);
this.needsSave = true;
}
@Override
public String toString() {
return className;
}
@Override
public int compareTo(GuiClass o) {
return className.compareTo(o.className);
}
public List<TraitConfigOption> getConfig() {
return config;
}
}