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;
import de.tobiyas.util.items.ItemUtils.ItemQuality;
public class GuiRace implements Comparable<GuiRace>, NeedsSave {
/**
* THe Traits of the Race
*/
private final Set<GuiTrait> traits = new HashSet<GuiTrait>();
/**
* The config of the Race.
*/
private final YAMLConfigExtended ymlConfig;
/**
* The Name of the Race
*/
private String raceName = "NONE";
/**
* The NodeName of the Race
*/
private String raceNodeName = "NONE";
/**
* The Armor permissions.
*/
private final Set<ItemQuality> armor = new HashSet<ItemQuality>();
/**
* The Config to use.
*/
private final List<TraitConfigOption> config = new LinkedList<TraitConfigOption>();
/**
* if we need to save.
*/
private boolean needsSave = false;
public GuiRace(YAMLConfigExtended raceConfig, String raceName, String raceNodeName, String tag, String manaBonus, String armor, Set<GuiTrait> traits) {
this.ymlConfig = raceConfig;
this.traits.addAll(traits);
this.raceNodeName = raceNodeName;
this.raceName = raceName;
//parse Armor:
armor = armor.toLowerCase();
if(armor.contains("leather")) this.armor.add(ItemQuality.Leather);
if(armor.contains("iron")) this.armor.add(ItemQuality.Iron);
if(armor.contains("chain")) this.armor.add(ItemQuality.Chain);
if(armor.contains("gold")) this.armor.add(ItemQuality.Gold);
if(armor.contains("diamond")) this.armor.add(ItemQuality.Diamond);
if(armor.contains("all")) for(ItemQuality i : ItemQuality.values()) this.armor.add(i);
for(GuiTrait trait : traits) trait.setBelongingRace(this);
//setting the config.
this.config.add(new TraitConfigStringOption("name", true, raceName));
this.config.add(new TraitConfigStringOption("manaBonus", false, manaBonus));
this.config.add(new TraitConfigStringOption("tag", true, tag));
Collections.sort(config);
}
public String getRaceName() {
return raceName;
}
public String getRaceNodeName() {
return raceNodeName;
}
public void setRaceNodeName(String raceNodeName) {
this.raceNodeName = raceNodeName;
this.needsSave = true;
}
public void setRaceName(String raceName) {
this.raceName = raceName;
this.needsSave = true;
}
public Set<ItemQuality> getArmor() {
return armor;
}
public Set<GuiTrait> getTraits() {
return traits;
}
public void addTrait(GuiTrait trait){
trait.setBelongingRace(this);
this.traits.add(trait);
this.needsSave = true;
}
public void removeTrait(GuiTrait trait){
this.traits.remove(trait);
this.needsSave = true;
}
public List<TraitConfigOption> getConfig() {
return config;
}
/**
* 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(raceNodeName + ".config." + option.getName(), option.getCurrentSelection());
option.notifySaved();
}
//Last save the Traits:
for( GuiTrait trait : traits ){
trait.saveTo(ymlConfig, raceNodeName + ".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;
}
@Override
public String toString() {
return raceName;
}
@Override
public int compareTo(GuiRace o) {
return raceName.compareTo(o.raceName);
}
}