package tc.oc.pgm.tutorial;
import java.util.List;
import java.util.Optional;
import javax.inject.Inject;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import org.jdom2.Element;
import tc.oc.commons.bukkit.util.BukkitUtils;
import tc.oc.pgm.points.PointParser;
import tc.oc.pgm.points.PointProvider;
import tc.oc.pgm.points.PointProviderAttributes;
import tc.oc.pgm.points.RandomPointProvider;
import tc.oc.pgm.utils.XMLUtils;
import tc.oc.pgm.xml.InvalidXMLException;
import tc.oc.pgm.xml.parser.ElementParser;
public class TutorialParser implements ElementParser<Tutorial> {
private final PointParser pointParser;
@Inject private TutorialParser(PointParser pointParser) {
this.pointParser = pointParser;
}
@Override
public Tutorial parseElement(Element element) throws InvalidXMLException {
List<TutorialStage> prefixStages = Lists.newArrayList();
List<TutorialStage> stages = Lists.newArrayList();
List<TutorialStage> suffixStages = Lists.newArrayList();
for(Element tutorialEl : element.getChildren("tutorial")) {
Element prefixEl = tutorialEl.getChild("prefix");
if(prefixEl != null) {
prefixStages.addAll(parseStages(pointParser, prefixEl));
}
Element suffixEl = tutorialEl.getChild("suffix");
if(suffixEl != null) {
suffixStages.addAll(parseStages(pointParser, suffixEl));
}
stages.addAll(parseStages(pointParser, tutorialEl));
}
stages.addAll(0, prefixStages);
stages.addAll(suffixStages);
return new Tutorial(stages);
}
private List<TutorialStage> parseStages(PointParser pointParser, Element parent) throws InvalidXMLException {
List<TutorialStage> stages = Lists.newArrayList();
for(Element stageEl : parent.getChildren("stage")) {
String title = BukkitUtils.colorize(XMLUtils.getRequiredAttribute(stageEl, "title").getValue());
List<String> message = parseMessage(stageEl);
PointProvider teleport = parseTeleport(pointParser, stageEl);
stages.add(new TutorialStage(title, message, teleport));
}
return stages;
}
private List<String> parseMessage(Element stageEl) {
ImmutableList.Builder<String> builder = ImmutableList.builder();
Element messageEl = stageEl.getChild("message");
if(messageEl != null) {
for(Element lineEl : messageEl.getChildren("line")) {
builder.add(BukkitUtils.colorize(lineEl.getText()));
}
}
return builder.build();
}
private PointProvider parseTeleport(PointParser parser, Element stageEl) throws InvalidXMLException {
Element teleportEl = stageEl.getChild("teleport");
if(teleportEl != null) {
return new RandomPointProvider(parser.parse(teleportEl, new PointProviderAttributes()));
} else {
return null;
}
}
}