package net.sourceforge.pain.tools.guitool.action.admin;
import net.sourceforge.pain.network.guitool.*;
import net.sourceforge.pain.tools.guitool.*;
import net.sourceforge.pain.tools.guitool.action.*;
import net.sourceforge.pain.tools.guitool.dialog.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.html.*;
import java.awt.*;
import java.util.*;
import java.util.Map;
public class ServerStatusExplorerAction implements GTAction {
    private static JEditorPane instance;
    private boolean infoRead = false;
    public void executeAction() {
        try {
            final Component component = getComponent();
            if (!infoRead) {
                refresh();
            }
            GuiTool.appFrame.workspacePanel.setActiveComponent(component);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private Component getComponent() throws Exception {
        if (instance == null) {
            instance = HtmlComponentRegistry.get(getClass());
            instance.addHyperlinkListener(new MyHyperlinkListenerImpl());
        }
        return instance;
    }
    private class MyHyperlinkListenerImpl extends DefaultHyperlinkListenerImpl {
        public void hyperlinkUpdate(HyperlinkEvent ev) {
            if (ev.getEventType() != HyperlinkEvent.EventType.ACTIVATED) {
                return;
            }
            final WorkspacePanel workspacePanel = GuiTool.appFrame.getWorkspacePanel();
            try {
                if (ev.getURL().toString().endsWith("/update")) {
                    GlobalPerformer.ensureConnected();
                    refresh();
                } else if (ev.getURL().toString().endsWith("/reload")) {
                    try {
                        if (JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(workspacePanel, "Reload logic code?", "Select an option:" ,JOptionPane.YES_NO_OPTION)) {
                            GuiTool.log("ReloadCode: start");
                            GTNetPacket p = GlobalPerformer.getConnection().sendBlocking(new GTNetPacket("ReloadLogicGTEvent", new String[]{"reload"}));
                            GuiTool.log("ReloadCode: "+p.data);
                            JOptionPane.showMessageDialog(workspacePanel, "Code reloading status:"+(String) p.data);
                        }
                    } catch (Exception e) {
                        GuiTool.showFailInfo(e);
                    }
                } else if (ev.getURL().toString().endsWith("/shutdown")) {
                    try {
                        if (JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(workspacePanel, "Shutdown Server? (Server could not be started from GuiTool)", "Select an option:" ,JOptionPane.YES_NO_OPTION)) {
                            GuiTool.log("ShutdownServer: start");
                            GTNetPacket p = GlobalPerformer.getConnection().sendBlocking(new GTNetPacket("RestartGTEvent", new String[]{"shutdown"}));
                            GuiTool.log("ShutdownServer: "+p.data);
                            JOptionPane.showMessageDialog(workspacePanel, "ServerShutdown status:"+(String) p.data);
                        }
                    } catch (Exception e) {
                        GuiTool.showFailInfo(e);
                    }
                } else {
                    super.hyperlinkUpdate(ev);
                }
            } catch (IllegalStateException e) {
                GuiTool.showFailInfo(e);
            }
        }
    }
    private void refresh() {
        GuiTool.log("refreshing server status info");
        try {
            GTNetPacket response = GlobalPerformer.getConnection().sendBlocking(new GTNetPacket("ServerStatus", ""));
            Map map = (Map) response.data;
            HTMLDocument doc = (HTMLDocument) instance.getDocument();
            for (Iterator it = map.keySet().iterator(); it.hasNext();) {
                String key = (String) it.next();
                String value = (String) map.get(key);
                javax.swing.text.Element e = doc.getElement(key);
                if (e == null) {
                    GuiTool.log("unknown status property:" + key);
                } else {
                    doc.setInnerHTML(e, value);
                }
            }
            infoRead = true;
        } catch (Exception e) {
            e.printStackTrace();
            JOptionPane.showMessageDialog(instance, "Error:" + e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
        }
    }
}