package frontEnd;

import java.awt.AWTException;
import java.awt.Desktop;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.logging.Level;
import java.util.logging.Logger;

import core.ipc.IIPCService;
import core.ipc.IPCServiceManager;
import core.ipc.IPCServiceName;

public class MinimizedFrame extends TrayIcon {

	private static final Logger LOGGER = Logger.getLogger(MinimizedFrame.class.getName());

	private final MainBackEndHolder backEnd;

	public MinimizedFrame(Image image, final MainBackEndHolder backEnd) {
		super(image);

		this.backEnd = backEnd;

		PopupMenu trayPopupMenu = new PopupMenu();

		MenuItem miInterface = new MenuItem("Show UI");
		miInterface.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				show();
			}
		});

		MenuItem miClose = new MenuItem("Exit");
		miClose.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				exit();
			}
		});

		trayPopupMenu.add(miInterface);
		trayPopupMenu.add(miClose);

		setToolTip("Repeat");
		setPopupMenu(trayPopupMenu);
		setImageAutoSize(true);

		addMouseListener(new MouseAdapter(){
			@Override
			public void mouseReleased(MouseEvent e) {
				if (javax.swing.SwingUtilities.isLeftMouseButton(e)) {
					show();
				}
			}
		});
	}

	private void show() {
		if (!Desktop.isDesktopSupported()) {
			LOGGER.warning("Cannot open browser to UI since Desktop module is not supported.");
			return;
		}

		IIPCService server = IPCServiceManager.getIPCService(IPCServiceName.WEB_UI_SERVER);
		try {
			Desktop.getDesktop().browse(new URI("http://localhost:" + server.getPort()));
		} catch (IOException | URISyntaxException ex) {
			LOGGER.log(Level.WARNING, "Failed to show UI in browser.", ex);
		}
	}

	protected void add() throws AWTException {
		SystemTray.getSystemTray().add(this);
	}

	protected void remove() {
		SystemTray.getSystemTray().remove(this);
	}

	private void exit() {
		backEnd.scheduleExit(10);
	}
}