// Tray.java
// (C) 2008-2012 by David Wieditz; d.wieditz@gmx.de
// (C) 2008 by Florian Richter; Florian_Richter@gmx.de
// first published 13.07.2008 on http://yacy.net
//
// This is a part of YaCy, a peer-to-peer based web search engine
//
// $LastChangedDate$
// $LastChangedRevision$
// $LastChangedBy$
//
// LICENSE
// 
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

package net.yacy.gui;

import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import net.yacy.gui.framework.Browser;
import net.yacy.kelondro.util.OS;
import net.yacy.search.Switchboard;
import net.yacy.search.SwitchboardConstants;



public final class Tray {
	private Switchboard sb;

	private TrayIcon ti;
	private String trayLabel;

	final private static boolean deutsch = System.getProperty("user.language","").equals("de");
	final private static boolean french = System.getProperty("user.language","").equals("fr");

	// states
	private boolean isShown = false;
	private boolean appIsReady = false;
	private boolean menuEnabled = true;

	public Tray(final Switchboard sb_par) {
		sb = sb_par;
		menuEnabled = sb.getConfigBool(SwitchboardConstants.TRAY_MENU_ENABLED, true);
		trayLabel = sb.getConfig(SwitchboardConstants.TRAY_ICON_LABEL, "YaCy");
		try {
			final boolean trayIconEnabled = sb.getConfigBool(SwitchboardConstants.TRAY_ICON_ENABLED, false);
			final boolean trayIconForced = sb.getConfigBool(SwitchboardConstants.TRAY_ICON_FORCED, false);
			if (trayIconEnabled && (OS.isWindows || trayIconForced)) {
				System.setProperty("java.awt.headless", "false"); // we have to switch off headless mode, else all will fail

				if(SystemTray.isSupported()) {
					final String iconPath = sb.getAppPath().toString() + "/addon/YaCy_TrayIcon.png".replace("/", File.separator);
					ActionListener al = new ActionListener() {
						public void actionPerformed(final ActionEvent e) {
							doubleClickAction();
						}
					};
					final Image i = Toolkit.getDefaultToolkit().getImage(iconPath);
					final PopupMenu menu = (menuEnabled) ? getPopupMenu() : null;
					ti = new TrayIcon(i, trayLabel, menu);
					ti.setImageAutoSize(true);
					ti.addActionListener(al);
					SystemTray.getSystemTray().add(ti);
					isShown = true;
				} else {
					System.setProperty("java.awt.headless", "true");
				}
			}
		} catch (final Exception e) {
			System.setProperty("java.awt.headless", "true");
		}
	}

	/**
	 * set all functions available
	 */
	public void setReady() {
		appIsReady = true;
	}

	public void remove() {
		if (isShown){
			SystemTray.getSystemTray().remove(ti);
			ti = null;
			isShown = false;
		}
	}

	private void doubleClickAction() {
		if (!appIsReady) {
			String label;
			if (deutsch)
				label = "Bitte warten bis YaCy gestartet ist.";
			else if (french)
				label = "S'il vous plaît attendre jusqu'à YaCy est démarré.";
			else
				label = "Please wait until YaCy is started.";
			//ti.displayMessage("YaCy",label);
			ti.displayMessage("YaCy", label, TrayIcon.MessageType.INFO);
		} else {
			openBrowserPage("");
		}
	}

	/**
	 * 
	 * @param browserPopUpPage relative path to the webserver root
	 */
	private void openBrowserPage(final String browserPopUpPage) {
		if(!menuEnabled) return;
		// no need for https, because we are on localhost
		Browser.openBrowser("http://localhost:" + sb.getConfig("port", "8090") + "/" + browserPopUpPage);
	}

	private PopupMenu getPopupMenu() {
		String label;

		PopupMenu menu = new PopupMenu();
		MenuItem menuItem;

		// YaCy Search
		if (deutsch)
			label = "YaCy Suche";
		else if (french)
			label = "YaCy Recherche";
		else
			label = "YaCy Search";
		menuItem = new MenuItem(label);
		menuItem.addActionListener(new ActionListener() {
			public void actionPerformed(final ActionEvent e) {
				openBrowserPage("");
			}
		});
		menu.add(menuItem);


		/*  no prominent compare since google can not be displayed in a frame anymore
		// Compare YaCy
		if (deutsch)
			label = "Vergleichs-Suche";
		else if (french)
			label = "Comparer YaCy";
		else
			label = "Compare YaCy";
		menuItem = new MenuItem(label);
		menuItem.addActionListener(new ActionListener() {
			public void actionPerformed(final ActionEvent e) {
				openBrowser("compare_yacy.html");
			}
		});
		menu.add(menuItem);
		 */

		// Peer Administration
		if (deutsch)
			label = "Peer Administration";
		else if (french)
			label = "Peer Administration";
		else
			label = "Peer Administration";
		menuItem = new MenuItem(label);
		menuItem.addActionListener(new ActionListener() {
			public void actionPerformed(final ActionEvent e) {
				openBrowserPage("Status.html");
			}
		});
		menu.add(menuItem);

		// Separator
		menu.addSeparator();

		// Quit
		if(deutsch) 
			label = "YaCy Beenden";
		else if(french)
			label = "Arrêt YaCy";
		else
			label = "Shutdown YaCy";
		menuItem = new MenuItem(label);
		menuItem.addActionListener(new ActionListener() {
			public void actionPerformed(final ActionEvent e) {
				sb.terminate("shutdown from tray");
			}
		});
		menu.add(menuItem);
		return menu;
	}

}