package magic.ui.widget.firemind;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.nio.file.Path;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import magic.FiremindQueueWorker;
import magic.data.GeneralConfig;
import magic.data.MagicIcon;
import magic.firemind.FiremindClient;
import magic.ui.MagicImages;
import magic.translate.MText;
import magic.utility.MagicFileSystem.DataPath;
import magic.utility.MagicFileSystem;
import magic.utility.MagicSystem;
import net.miginfocom.swing.MigLayout;
@SuppressWarnings("serial")
public class FiremindWorkerPanel extends JPanel {
// translatable strings
private static final String _S1 = "Cancel";
private static final String _S2 = "Running";
private static final String _S3 = "Not running";
private static final String _S4 = "Start Firemind Worker";
private static final String _S5 = "Version is outdated. Please update Magarena.";
private static final String _S6 = "Access Key";
protected final GeneralConfig CONFIG = GeneralConfig.getInstance();
protected final JLabel accessKeyLabel = getAccessKeyLabel();
private final JLabel statusTextField = new JLabel();
private final JTextField accessKeyTextField = new JTextField();
private final MigLayout migLayout = new MigLayout();
protected final JLabel captionLabel = getCaptionLabel(getProgressCaption());
private final JButton runButton = new JButton();
private final JButton cancelButton = new JButton(MText.get(_S1));
private SwingWorker<String, Void> firemindWorker;
private boolean isRunning = false;
protected SwingWorker<String, Void> getFiremindWorker() {
return new FiremindWorkerRunner(); //TODO (downloadList);
}
protected String getProgressCaption(){
if(isRunning){
return MText.get(_S2);
}else{
return MText.get(_S3);
}
}
protected String getLogFilename() {
return "fireindWorker.log";
}
protected String getStartButtonCaption() {
return MText.get(_S4);
}
public FiremindWorkerPanel() {
CONFIG.load();
setLookAndFeel();
refreshLayout();
setActions();
}
public boolean isRunning() {
return this.isRunning;
}
protected void saveDownloadLog(final List<String> downloadLog) {
final Path logPath = MagicFileSystem.getDataPath(DataPath.LOGS).resolve(getLogFilename());
System.out.println("saving log : " + logPath);
try (final PrintWriter writer = new PrintWriter(logPath.toFile())) {
for (String cardName : downloadLog) {
writer.println(cardName);
}
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
}
private void setActions() {
runButton.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
CONFIG.setFiremindAccessToken(accessKeyTextField.getText().trim());
CONFIG.save();
FiremindClient.setHostByEnvironment();
if (FiremindClient.checkMagarenaVersion(MagicSystem.VERSION)){
setRunningState();
notifyStatusChanged(true);
firemindWorker = getFiremindWorker();
firemindWorker.execute();
}else{
statusTextField.setText(MText.get(_S5));
}
}
});
cancelButton.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
doCancelFiremindWorker();
}
});
}
public void doCancel() {
doCancelFiremindWorker();
isRunning = false;
}
private void doCancelFiremindWorker() {
if (firemindWorker != null && !firemindWorker.isCancelled() & !firemindWorker.isDone()) {
firemindWorker.cancel(true);
setButtonState(false);
}
}
protected void setButtonState(final boolean isRunning) {
runButton.setVisible(!isRunning);
cancelButton.setVisible(isRunning);
refreshLayout();
}
private void setRunningState() {
setButtonState(true);
captionLabel.setIcon(MagicImages.getIcon(MagicIcon.BUSY16));
}
private void refreshLayout() {
removeAll();
migLayout.setLayoutConstraints("flowy, insets 2, gapy 0");
accessKeyTextField.setText(CONFIG.getFiremindAccessToken());
add(accessKeyLabel, "w 100%");
add(accessKeyTextField, "w 100%");
add(runButton.isVisible() ? runButton : cancelButton, "w 100%");
add(statusTextField, "w 100%");
}
private void setLookAndFeel() {
// Layout manager.
setLayout(migLayout);
// download button
runButton.setEnabled(true);
runButton.setText(getStartButtonCaption());
}
private JLabel getAccessKeyLabel() {
final JLabel lbl = new JLabel();
lbl.setText(MText.get(_S6));
// lbl.setHorizontalAlignment(SwingConstants.LEFT);
// lbl.setHorizontalTextPosition(SwingConstants.LEADING);
lbl.setOpaque(false);
lbl.setFont(lbl.getFont().deriveFont(Font.BOLD));
return lbl;
}
private JLabel getCaptionLabel(final String text) {
final ImageIcon ii = MagicImages.getIcon(MagicIcon.BUSY16);
final JLabel lbl = new JLabel(ii);
lbl.setText(text);
lbl.setHorizontalAlignment(SwingConstants.LEFT);
lbl.setHorizontalTextPosition(SwingConstants.LEADING);
lbl.setOpaque(false);
lbl.setFont(lbl.getFont().deriveFont(Font.BOLD));
return lbl;
}
protected void notifyStatusChanged(boolean newValue) {
assert SwingUtilities.isEventDispatchThread();
final boolean oldState = this.isRunning;
this.isRunning = newValue;
firePropertyChange("isRunning", oldState, newValue);
}
private class FiremindWorkerRunner extends SwingWorker<String, Void> {
@Override
protected String doInBackground() throws Exception {
// restarts after 25 games
while(true){
String[] arguments = new String[]{""};
FiremindQueueWorker.main(arguments);
}
}
@Override
protected void done() {
}
}
}