/*
 * $Id: ShowServerStatusAction.java 7738 2011-08-03 18:38:35Z uckelman $
 *
 * Copyright (c) 2000-2009 by Rodney Kinney, Brent Easton
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License (LGPL) as published by the Free Software Foundation.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, copies are available
 * at http://www.opensource.org.
 */
package VASSAL.chat.ui;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.net.URL;

import javax.swing.AbstractAction;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JToolBar;

import VASSAL.build.GameModule;
import VASSAL.chat.ChatServerConnection;
import VASSAL.chat.HttpMessageServer;
import VASSAL.chat.ServerStatus;
import VASSAL.chat.messageboard.MessageBoard;
import VASSAL.chat.messageboard.MessageBoardControls;
import VASSAL.chat.peer2peer.PeerPoolInfo;
import VASSAL.i18n.Resources;
import VASSAL.tools.menu.MenuManager;

/**
 * Description?
 */
public class ShowServerStatusAction extends AbstractAction {
  private static final long serialVersionUID = 1L;

  private static Window frame;

  public ShowServerStatusAction(ServerStatus status, URL iconURL) {
    this(status, iconURL, true);
  }

  public ShowServerStatusAction(ServerStatus status, URL iconURL, boolean includeMessageControls) {
    if (frame == null) {
      frame = new Window(status, includeMessageControls);
    }
    if (iconURL == null) {
      putValue(NAME, Resources.getString("Chat.server_status")); //$NON-NLS-1$
    }
    else {
      putValue(SMALL_ICON, new ImageIcon(iconURL));
    }
    putValue(SHORT_DESCRIPTION, Resources.getString("Chat.display_connections")); //$NON-NLS-1$
  }

  public void actionPerformed(ActionEvent e) {
    frame.refresh();
  }

  private static class Window extends JFrame implements PropertyChangeListener {
    private static final long serialVersionUID = 1L;

    private ServerStatusView view;
    private MessageBoardControls messageMgr;

    public Window(ServerStatus status, boolean includeMessageControls) {
      super(Resources.getString("Chat.server_status")); //$NON-NLS-1$
      setJMenuBar(MenuManager.getInstance().getMenuBarFor(this));

      view = new ServerStatusView(status);
      view.addPropertyChangeListener(ServerStatusView.SELECTION_PROPERTY,this);
      add(view);
      if (includeMessageControls) {
        messageMgr = new MessageBoardControls();
        final JToolBar toolbar = new JToolBar();
        toolbar.setFloatable(false);
        toolbar.add(messageMgr.getCheckMessagesAction());
        toolbar.add(messageMgr.getPostMessageAction());
        add(toolbar, BorderLayout.NORTH);
      }
      pack();
      setSize(Math.max(getSize().width,400),Math.max(getSize().height,300));
      Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
      setLocation(d.width / 2 - getSize().width / 2,
                  d.height / 2 - getSize().height / 2);
    }

    public void refresh() {
      if (!isVisible()) {
        setVisible(true);
      }
      else {
        toFront();
      }
      view.refresh();
    }

    public void propertyChange(PropertyChangeEvent evt) {
      MessageBoard server = null;
      String name = null;
      if (evt.getNewValue() instanceof ServerStatus.ModuleSummary) {
        final String moduleName = ((ServerStatus.ModuleSummary) evt.getNewValue()).getModuleName();
        server = new HttpMessageServer(new PeerPoolInfo() {
          public String getModuleName() {
            return moduleName;
          }

          public String getUserName() {
            return ((ChatServerConnection) GameModule.getGameModule().getServer()).getUserInfo().getName();
          }
        });
      }
      if (messageMgr != null) {
        messageMgr.setServer(server, name);
      }
    }
  }
}