// GraphTea Project: http://github.com/graphtheorysoftware/GraphTea
// Copyright (C) 2012 Graph Theory Software Foundation: http://GraphTheorySoftware.com
// Copyright (C) 2008 Mathematical Science Department of Sharif University of Technology
// Distributed under the terms of the GNU General Public License (GPL): http://www.gnu.org/licenses/
package graphtea.plugins.main.saveload.core.extension;

import graphtea.graph.atributeset.GraphAttrSet;
import graphtea.graph.graph.GraphModel;
import graphtea.graph.ui.GTabbedGraphPane;
import graphtea.platform.core.BlackBoard;
import graphtea.platform.core.exception.ExceptionHandler;
import graphtea.plugins.main.core.actions.StatusBarMessage;
import graphtea.plugins.main.saveload.ExampleFileFilter;
import graphtea.plugins.main.saveload.SaveLoadPluginMethods;
import graphtea.plugins.main.saveload.core.GraphIOException;
import graphtea.ui.extension.AbstractExtensionAction;

import javax.swing.*;
import java.io.File;
import java.io.IOException;

/**
 * @author azin azadi

 */
public class GraphWriterExtensionAction extends AbstractExtensionAction {

    private final GraphWriterExtension ge;
    private String prefix;

    public GraphWriterExtensionAction(BlackBoard bb, GraphWriterExtension ge) {
        super(bb, ge);
        this.ge = ge;
    }

    public String getParentMenuName() {
        return "File.Save Graph To";
    }

    public String getMenuNamePrefix() {
        return "";
    }

    public void performExtension() {
        try {
            if (ge != null)
                exportGraph();
        }
        catch (Exception e) {
            ExceptionHandler.catchException(e);
        }
    }

    String ss;
    GraphModel g;
    IOException ee;
    GraphIOException gioe;

    private void exportGraph() throws IOException {
        g = blackboard.getData(GraphAttrSet.name);
        JFileChooser fileChooser = new JFileChooser();
        ExampleFileFilter fileFilter = new ExampleFileFilter(ge.getExtension(), ge.getName());
        fileFilter.setDescription(ge.getDescription());
        fileChooser.setFileFilter(fileFilter);
        if (GraphIOExtensionHandler.defaultFile != null)
            fileChooser.setCurrentDirectory(new File(GraphIOExtensionHandler.defaultFile));

        int l = fileChooser.showSaveDialog(null);
        if (l == JFileChooser.APPROVE_OPTION) {
            ss = fileChooser.getSelectedFile().getAbsolutePath();
            if (!ge.getExtension().equalsIgnoreCase(SaveLoadPluginMethods.getExtension(fileChooser.getSelectedFile())))
                ss += "." + ge.getExtension();
            GraphIOExtensionHandler.defaultFile = ss;
            if (!((new File(ss)).isFile())
                    || JOptionPane.showConfirmDialog(
                    null,
                    "A file with name "
                            + ss
                            + " exists! Do you want to rewrite it?",
                    "GraphTea Saving ...",
                    JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {

                GTabbedGraphPane.showNotificationMessage("Saving in the file ...", blackboard, true);
                new Thread(() -> {
                    try {
                        ge.write(new File(ss), g);
                    } catch (GraphIOException e) {
                        //todo: handle exceptions
                        gioe = e;
                    }
                    StatusBarMessage.setMessage(blackboard, "");
                    GTabbedGraphPane.showTimeNotificationMessage("File Saved!", blackboard, 5000, true);
                }).start();

            }
        }
    }
}