package eu.dnetlib.enabling.ui.common.utils;

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;

public abstract class GWTMenu extends MenuBar {
	protected Map<String, GWTPage> historyItems = new HashMap<String, GWTPage>(); 
	private String defaultToken = "";
	private String loginToken = "";
	
	public GWTMenu(LoginPage loginPage) {
		super();
		setAutoOpen(true);
		setStyleName("null");
		prepareItem(loginPage, false, true);
	}
	
	abstract protected void prepareMenu();	
	
	
	public GWTPage getPage(String historyToken) {
		if (!CookieSession.isValidSession()) {
			clearItems();
			return getLoginPage(); 
		} 
		
		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(GWTPage 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() {
			@Override
			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 GWTPage getDefaultPage() {
		GWTPage page = historyItems.get(getDefaultToken());
		if (page == null) {
			Window.alert("Default Page not setted");
		}
		return historyItems.get(getDefaultToken());
	}

	public GWTPage getLoginPage() {
		GWTPage 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() {
			@Override
			public void execute() {
				History.newItem(historyToken);
			}
		};
	}


}
