package eu.dnetlib.client.shared;

import java.util.HashMap;
import java.util.Map.Entry;
import java.util.logging.Logger;

import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseOutHandler;
import com.google.gwt.event.dom.client.MouseOverEvent;
import com.google.gwt.event.dom.client.MouseOverHandler;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.VerticalPanel;

import eu.dnetlib.client.resources.frame.Frames;
import eu.dnetlib.client.resources.item.Items;
import eu.dnetlib.client.resources.systemconfigration.SystemConfiguration;
import eu.dnetlib.client.resources.theme.Themes;
import eu.dnetlib.client.resources.topic.Topics;
import eu.dnetlib.client.resources.usermanagement.Users;

public class MainMenuBar {
	private HorizontalPanel menu = new HorizontalPanel();
	private VerticalPanel resourcePanel;
	private int visibleMenu = -1;
	private static Logger log = Logger.getLogger("MainMenuBar");
	private Items items;
	private Frames frames;
	private Topics topics;
	private Themes themes;
	private Users userManagement = null;
	private SystemConfiguration systemConfiguration = null;
	private HashMap<MenuPage, Integer> menuPages = new HashMap<MenuPage, Integer>();
	private int menuCount = 0;
	private MenuPage defaultMenuPage;

	public MainMenuBar(final VerticalPanel resourcePanel) {

		this.resourcePanel = resourcePanel;
		menuCount = 0;
		menu.add(createMenuButton("Themes", MenuPage.THEME));
		menu.add(createMenuButton("Topics", MenuPage.TOPIC));
		menu.add(createMenuButton("Frames", MenuPage.FRAME));
		menu.add(createMenuButton("Items", MenuPage.ITEMS));
		menu.add(createMenuButton("User Management", MenuPage.USERS));

		menu.add(createMenuButton("System Configuration", MenuPage.CNFGR));

		menuPages.put(MenuPage.ERROR, menuCount);

	}
	public void parseHistoryToken(String historyToken) {
		parseHistoryToken(historyToken, true);
	}
	public void parseHistoryToken(String historyToken, boolean showComponentMode) {
		log.info("\nParsing token \n" + historyToken + "" + "\n");

		try {
			if (historyToken.length() > 5 && historyToken.substring(0, 5).equals("page=")) {
				MenuPage menuPage = getMenuPage(historyToken.substring(5, 10));
				setMenuITemVisibleNoHistory(menuPage);
				if(showComponentMode){
				chooseComponentMode(menuPage, historyToken);
				}else{
					
					History.newItem("page=" + menuPage);
				}
			} else {
				log.info("  no page go to default");
				if (defaultMenuPage != null) {
					setMenuITemVisibleNoHistory(defaultMenuPage);
				} else {
					setMenuITemVisibleNoHistory(MenuPage.ERROR);

				}
			}

		} catch (IndexOutOfBoundsException e) {
			log.info("ERRORR  out of bounds page");
			e.printStackTrace();
			setMenuITemVisibleNoHistory(MenuPage.ERROR);
		}
	}
public void chooseComponentMode(MenuPage menuPage, String historyToken){
	if (historyToken.length() > 14 && menuPage != MenuPage.ERROR) {
		String id = historyToken.substring(14, historyToken.length());
		log.info("iiiiiiiiid id:::::::" + id);
		if (menuPage == (MenuPage.ITEMS)) { // item id

			if (id.contains("?edit=true")) {
				id = id.substring(0, id.length() - 10);
				log.info("edit iiiiiiiiid id:::::::" + id);

				// items.getItems().setItemtoEdit(id);
				items.cbAndEditHandlerForItem(id, false);
			} else {
				// items.getItems().ItemClickAction(id);
				items.cbAndpreviewHandlerForItem(id, false);

			}
		} else if (menuPage == (MenuPage.FRAME)) { // frame id
			if (id.contains("?edit=true")) {
				id = id.substring(0, id.length() - 10);
				log.info("edit iiiiiiiiid id:::::::" + id);
					frames.cbAndEditHandlerForFrame(id, false);
			} else {
					frames.cbAndpreviewHandlerForFrame(id, false);
			}

		} else if (menuPage == (MenuPage.TOPIC)) { // frame id
			log.info("edit iiiiiiiiid id:::::::" + id);

			if (id.contains("?edit=true")) {
				id = id.substring(0, id.length() - 10);
				log.info("edit iiiiiiiiid id:::::::" + id);
					topics.cbAndEditHandlerForTopic(id, false);
			} else {
					topics.cbAndpreviewHandlerForTopic(id, false);
			}
		} else if (menuPage == (MenuPage.THEME)) {
			log.info("Theme Page  historyToken::" + id);
			if (id.contains("?edit=true")) {
				id = id.substring(0, id.length() - 10);
				log.info("edit iiiiiiiiid id:::::::" + id);
					themes.cbAndEditHandlerForTheme(id, false);

			} else {
				log.info("preview id:" + id);
					themes.cbAndpreviewHandlerForTheme(id, false);
			}
		} else if (menuPage == (MenuPage.USERS)) {
			if (userManagement != null) {
				if (id.contains("myProfile")) {
					userManagement.showMyProfile();
				}
			} else {
				log.info("Its null usersssssss");
			}
		} else if (menuPage == (MenuPage.CNFGR)) {
			if (systemConfiguration != null) {

				if (id.contains(systemConfiguration.getSystemConfId())) {

					systemConfiguration.showSystemConfig();

				} else if (id.contains(systemConfiguration.getMainPageParametersId())) {

					systemConfiguration.showMainPageConfig();
				} else if (id.contains(systemConfiguration.getCreditsPageId())) {

					systemConfiguration.showCreditsPage();
				}

			} else {
				setMenuITemVisibleNoHistory(MenuPage.ERROR);

			}
		} else {
			log.info("ERRORR  wrong page");
			setMenuITemVisibleNoHistory(MenuPage.ERROR);
		}

	}
}
	public HorizontalPanel getMenu() {
		return this.menu;
	}

	private Label createMenuButton(String name, final MenuPage menuPage) {
		menuPages.put(menuPage, menuCount);
		menuCount++;
		final Label l = new Label(name);
		l.setStyleName("menuItem " + menuPage.toString().toLowerCase() + "MenuText");
		l.addDomHandler(new ClickHandler() {

			public void onClick(ClickEvent event) {

				History.newItem("page=" + menuPage);
			}
		}, ClickEvent.getType());
		l.addMouseOverHandler(new MouseOverHandler() {
			public void onMouseOver(MouseOverEvent arg0) {
				l.setStyleName("menuItemSelected " + menuPage.toString().toLowerCase() + "TabText");
			}
		});
		l.addMouseOutHandler(new MouseOutHandler() {
			public void onMouseOut(MouseOutEvent arg0) {
				if(visibleMenu!=menuPages.get(menuPage)){
					l.setStyleName("menuItem " + menuPage.toString().toLowerCase() + "MenuText");

				}
			}
		});
		return l;
	}

	public void setMenuITemVisible(MenuPage menuPage) {
		log.info("Set menu visible::" + menuPage);
		History.newItem("page=" + menuPage);

	}

	public void setMenuITemVisibleNoHistory(MenuPage menuPage) {
		int id = menuPages.get(menuPage);

		log.info("Set menu (no histor1y) visible::" + id);
 
		setMenuInVisible();

		if (!menuPage.equals(MenuPage.ERROR)) {
			resourcePanel.getWidget(id).setVisible(true);
			visibleMenu = id;
			menu.getWidget(id).setStyleName("menuItemSelected " + menuPage.toString().toLowerCase() + "TabText");
		} else {
			resourcePanel.getWidget(id).setVisible(true);
			visibleMenu = id;

		}
		showFirstTab(menuPage);

		if (menuPage.equals(MenuPage.CNFGR) && systemConfiguration == null) {
			setMenuITemVisibleNoHistory(MenuPage.ERROR);
		}
 
	}
	private void showFirstTab(MenuPage menuPage){
		if(menuPage.equals(MenuPage.ITEMS)&&items!=null){
			items.getTp().showFirstTabBar();
		}else if(menuPage.equals(MenuPage.FRAME)&&frames!=null){
			frames.getTp().showFirstTabBar();
		}
		else if(menuPage.equals(MenuPage.TOPIC)&&topics!=null){
			topics.getTp().showFirstTabBar();
		}else if(menuPage.equals(MenuPage.THEME)&&themes!=null){
			themes.getTp().showFirstTabBar();
		}
	}
	public void setMenuInVisible() {

		for (int i = 0; i < resourcePanel.getWidgetCount() - 1; i++) {
			resourcePanel.getWidget(i).setVisible(false);
			menu.getWidget(i).setStyleName("menuItem");

			for (Entry<MenuPage, Integer> menuPage : menuPages.entrySet()) {
				if (menuPage.getValue() == i) {
					menu.getWidget(i).setStyleName("menuItem " + menuPage.getKey().toString().toLowerCase() + "MenuText");
					visibleMenu = i;
					break;
				}
			}

		}
		if (resourcePanel.getWidgetCount() - 1 >= 0) {
			// set error page invisible too
			resourcePanel.getWidget(resourcePanel.getWidgetCount() - 1).setVisible(false);
			visibleMenu = resourcePanel.getWidgetCount() - 1;
			// error page has no menuitem
		}
	}

	public int getVisibleMenu() {
		return visibleMenu;
	}

	public void setItems(Items items) {
		this.items = items;
	}

	public void setFrames(Frames frames) {
		this.frames = frames;
	}

	public void setTopics(Topics topics) {
		this.topics = topics;
	}

	public void setThemes(Themes themes) {
		this.themes = themes;
	}

	public void setUserManagement(Users userManagement) {
		this.userManagement = userManagement;
	}

	public void setSystemConfiguration(SystemConfiguration systemConfiguration) {
		this.systemConfiguration = systemConfiguration;
		if (systemConfiguration == null) {
			menu.getWidget(5).setVisible(false);
		} else {
			menu.getWidget(5).setVisible(true);

		}
	}

	public enum MenuPage {
		ITEMS, FRAME, TOPIC, THEME, USERS, CNFGR, ERROR;
	}

	public MenuPage getMenuPage(String page) {
		log.info("PAGE is " + page);
		if (page.equals("ITEMS")) {
			return MenuPage.ITEMS;
		} else if (page.equals("FRAME")) {
			return MenuPage.FRAME;
		} else if (page.equals("TOPIC")) {
			return MenuPage.TOPIC;
		} else if (page.equals("THEME")) {
			return MenuPage.THEME;
		} else if (page.equals("USERS")) {
			return MenuPage.USERS;
		} else if (page.equals("CNFGR")) {
			return MenuPage.CNFGR;
		} else if (page.equals("ERROR")) {
			return MenuPage.ERROR;
		} else {
			return MenuPage.ERROR;
		}

	}

	public void setDefaultMenuPage(MenuPage defaultMenuPage) {
		this.defaultMenuPage = defaultMenuPage;
	}

}
