package org.mafagafogigante.dungeon.commands;
import org.mafagafogigante.dungeon.date.DungeonTimeParser;
import org.mafagafogigante.dungeon.date.Duration;
import org.mafagafogigante.dungeon.game.DungeonString;
import org.mafagafogigante.dungeon.game.Engine;
import org.mafagafogigante.dungeon.game.Game;
import org.mafagafogigante.dungeon.game.PartOfDay;
import org.mafagafogigante.dungeon.io.Writer;
import org.mafagafogigante.dungeon.util.DungeonMath;
import org.mafagafogigante.dungeon.util.Matches;
import org.mafagafogigante.dungeon.util.Messenger;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import java.awt.Color;
import java.util.Arrays;
/**
* The parser of the debugging Wait command.
*/
class DebugWaitParser {
private DebugWaitParser() {
throw new AssertionError();
}
/**
* Evaluates and returns a constant representing which syntax was used.
*/
private static Syntax evaluateSyntax(String[] arguments) {
if (isForSyntax(arguments)) {
return Syntax.FOR;
} else if (isUntilNextSyntax(arguments)) {
return Syntax.UNTIL;
} else {
return Syntax.INVALID;
}
}
private static boolean isForSyntax(String[] arguments) {
return arguments.length > 1 && "for".equalsIgnoreCase(arguments[0]);
}
private static boolean isUntilNextSyntax(String[] arguments) {
return arguments.length > 2 && "until".equalsIgnoreCase(arguments[0]) && "next".equalsIgnoreCase(arguments[1]);
}
private static void writeDebugWaitSyntax() {
DungeonString string = new DungeonString();
string.append("Usage: wait ");
final Color highlightColor = Color.ORANGE;
string.setColor(highlightColor);
string.append("for");
string.resetColor();
string.append(" [amount of time] or wait ");
string.setColor(highlightColor);
string.append("until next");
string.resetColor();
string.append(" [part of the day].");
Writer.write(string);
}
static void parseDebugWait(@NotNull String[] arguments) {
Syntax syntax = evaluateSyntax(arguments);
if (syntax == Syntax.INVALID) {
writeDebugWaitSyntax();
} else {
if (syntax == Syntax.FOR) {
String timeString = StringUtils.join(arguments, " ", 1, arguments.length);
try {
Duration duration = DungeonTimeParser.parsePeriod(timeString);
rollDate(DungeonMath.safeCastLongToInteger(duration.getSeconds()));
} catch (IllegalArgumentException badArgument) {
Writer.write("Provide small positive multipliers and units such as: '2 minutes and 10 seconds'");
}
} else if (syntax == Syntax.UNTIL) {
Matches<PartOfDay> matches = Matches.findBestCompleteMatches(Arrays.asList(PartOfDay.values()), arguments[2]);
if (matches.size() == 0) {
Writer.write("That did not match any part of the day.");
} else if (matches.size() == 1) {
rollDate(PartOfDay.getSecondsToNext(Game.getGameState().getWorld().getWorldDate(), matches.getMatch(0)));
} else {
Messenger.printAmbiguousSelectionMessage();
}
}
}
}
private static void rollDate(int seconds) {
Engine.rollDateAndRefresh(seconds);
Writer.write("Waited for " + seconds + " seconds.");
}
private enum Syntax {FOR, UNTIL, INVALID}
}