package eu.dnetlib.ui.gwt.client.util;

import java.util.HashMap;
import java.util.Map;

import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.MenuBar;
import com.google.gwt.user.client.ui.MenuItem;
import com.google.gwt.user.client.ui.RootPanel;

import eu.dnetlib.ui.gwt.client.otherpages.EmptyPage;
import eu.dnetlib.ui.gwt.client.otherpages.LoginPage;
import eu.dnetlib.ui.gwt.client.relpage.RelationPage;

public class GWTMenu extends MenuBar {
	protected Map<String, DorotyPage> historyItems = new HashMap<String, DorotyPage>(); 
	private String defaultToken = "";
	private String loginToken = "";

	public GWTMenu() {
		super();
		setAutoOpen(true);
		setStyleName("null");
		prepareItem(new LoginPage(), false, true);
	}

	private void prepareMenu() {
		MenuBar menuRel = new MenuBar(true);
		menuRel.addItem(prepareItem(new EmptyPage(), true, false));
		menuRel.addItem(prepareItem(new RelationPage(), false, false));
		addItem("<nobr>Relations</nobr>", true, menuRel);

		MenuBar menuSet = new MenuBar(true);
		menuSet.addItem(prepareItem(new EmptyPage(), false, false));
		addItem("<nobr>Sets</nobr>", true, menuSet);

	}	


	public DorotyPage getPage(String historyToken) {
		if (!CookieSession.isValidSession())        {
			clearItems();
			return getLoginPage(); 
		} else {
			if (getItems().size() == 0) {
				prepareMenu();
				addItem("Logout", new Command() {
					@Override
					public void execute() {
						CookieSession.removeCookie();
						Window.Location.reload();
					}
				});
			}
			if (historyItems.containsKey(historyToken)) {
				return historyItems.get(historyToken);
			} else {
				return getDefaultPage();
			}
		}
	}

	public MenuItem prepareItem(DorotyPage page, boolean isDefaultToken, boolean isLoginToken) {
		String token = page.getHistoryToken();
		if (isDefaultToken) { defaultToken = token; }
		if (isLoginToken)   { loginToken   = token; }
		historyItems.put(token, page);
		return new MenuItem(page.getMenuItem(), callPage(token));
	}

	public MenuItem prepareItem(String item, final String url, final Boolean newWindow) {
		return new MenuItem("<nobr>" + item + "</nobr>", true, new Command() {
			public void execute() {
				if (newWindow) {
					Window.open(url, "_blank", "");
				} else {
					Window.Location.replace(url);
				}
			}
		});
	}

	public String getDefaultToken() {
		return defaultToken;

	}
	public String getLoginToken() {
		return loginToken;
	}

	public DorotyPage getDefaultPage() {
		DorotyPage page = historyItems.get(getDefaultToken());
		if (page == null) {
			Window.alert("Default Page not setted");
		}
		return historyItems.get(getDefaultToken());
	}

	public DorotyPage getLoginPage() {
		DorotyPage page = historyItems.get(getLoginToken());
		if (page == null) {
			Window.alert("Login Page not setted");
		}
		return page;
	}


	public void publish(String rootPanelId) {
		// Add it to the root panel.
		RootPanel.get(rootPanelId).add(this);
	}


	protected Command callPage(final String historyToken) {
		return new Command() {
			public void execute() {
				History.newItem(historyToken);
			}
		};
	}


}
