package fr.lyrgard.hexScape.gui.desktop.action;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Iterator;
import javax.swing.AbstractAction;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;
import org.apache.commons.io.FileUtils;
import fr.lyrgard.hexScape.bus.GuiMessageBus;
import fr.lyrgard.hexScape.message.ErrorMessage;
import fr.lyrgard.hexScape.model.CurrentUserInfo;
import fr.lyrgard.hexScape.model.card.CardInstance;
import fr.lyrgard.hexScape.model.game.Game;
import fr.lyrgard.hexScape.model.marker.HiddenMarkerInstance;
import fr.lyrgard.hexScape.model.marker.MarkerInstance;
import fr.lyrgard.hexScape.model.player.Player;
public class SaveGameAction extends AbstractAction {
private static final long serialVersionUID = -2241823896873941912L;
private static final ImageIcon icon = new ImageIcon(ChooseMapAction.class.getResource("/gui/icons/chooseMap.png"));
private Component parent;
public SaveGameAction() {
super("Save game", icon);
}
@Override
public void actionPerformed(ActionEvent e) {
Game game = CurrentUserInfo.getInstance().getGame();
if (game != null) {
JFileChooser chooser = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter(
"Game save file", "hsg");
chooser.setFileFilter(filter);
chooser.setDialogType(JFileChooser.SAVE_DIALOG);
int returnVal = chooser.showSaveDialog(parent);
if(returnVal == JFileChooser.APPROVE_OPTION) {
File saveFile = chooser.getSelectedFile();
if (!saveFile.getName().endsWith(".hsg")) {
saveFile = new File(saveFile.getAbsolutePath() + ".hsg");
}
try {
// clone the game for removing hidden markers, and user ids
Game clone = Game.fromJson(game.toJson());
clone.setId(null);
for (Player player : clone.getPlayers()) {
player.setUserId(null);
if (player.getArmy() != null) {
for (CardInstance card : player.getArmy().getCards()) {
Iterator<MarkerInstance> it = card.getMarkers().iterator();
while (it.hasNext()) {
MarkerInstance marker = it.next();
if (marker instanceof HiddenMarkerInstance) {
it.remove();
}
}
}
}
}
String content = clone.toJson();
FileUtils.writeStringToFile(saveFile, content, StandardCharsets.UTF_8);
} catch (IOException ex) {
GuiMessageBus.post(new ErrorMessage(CurrentUserInfo.getInstance().getId(), "Error when trying to save the game"));
}
}
}
}
}