package magic.ui.screen.duel.game.log;
import java.awt.Color;
import java.awt.event.KeyEvent;
import java.nio.file.Path;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import magic.data.MagicIcon;
import magic.translate.MText;
import magic.ui.ScreenController;
import magic.ui.helpers.KeyEventAction;
import magic.ui.screen.HeaderFooterScreen;
import magic.ui.screen.widget.MenuButton;
import magic.ui.widget.M.MTextFileViewer;
import magic.utility.MagicFileSystem;
@SuppressWarnings("serial")
public class GameLogScreen extends HeaderFooterScreen {
// translatable strings
private static final String _S1 = "Basic";
private static final String _S2 = "Complete";
private static final String _S4 = "Basic log";
private static final String _S5 = "Displays an abbreviated log, omitting the AI's thoughts.";
private static final String _S6 = "Complete log";
private static final String _S7 = "Displays the complete log file with insight into how the AI thinks.";
private static final String _S8 = "Game log";
private static final Path LOGFILE = MagicFileSystem.getGameLogPath();
// static so it restores the last view when the screen is next opened.
private static boolean isBasicLog = true;
private final MTextFileViewer mainView = new MTextFileViewer();
private final JLabel modeLabel = new JLabel(MText.get(_S1));
public GameLogScreen() {
super(MText.get(_S8));
setDefaultProperties();
setHeaderContent(modeLabel);
setMainContent(mainView.component());
reloadTextFile();
}
private void setDefaultProperties() {
modeLabel.setForeground(Color.WHITE);
modeLabel.setFont(modeLabel.getFont().deriveFont(16f));
modeLabel.setHorizontalAlignment(SwingConstants.CENTER);
KeyEventAction.doAction(this, ()->ScreenController.closeActiveScreen())
.on(0, KeyEvent.VK_L);
}
private void setFooterButtons() {
clearFooterButtons();
if (isBasicLog) {
addToFooter(MenuButton.build(this::showDetailedLog,
MagicIcon.SWAP, MText.get(_S6), MText.get(_S7))
);
modeLabel.setText(MText.get(_S1));
} else {
addToFooter(MenuButton.build(this::showBasicLog,
MagicIcon.SWAP, MText.get(_S4), MText.get(_S5))
);
modeLabel.setText(MText.get(_S2));
}
}
private void reloadTextFile() {
mainView.setTextFile(LOGFILE, this::logFilter);
setFooterButtons();
}
/**
* If running in basic mode strips out any AI diagnostics.
*/
private String logFilter(String text) {
return isBasicLog
? Stream.of(text.split("\n"))
.filter(line -> line.startsWith("LOG"))
.map(line -> line.substring(3).trim())
.collect(Collectors.joining("\n"))
: text;
}
private void showBasicLog() {
isBasicLog = true;
reloadTextFile();
}
private void showDetailedLog() {
isBasicLog = false;
reloadTextFile();
}
}