package eu.dnetlib.dlms.swing.menu;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.swing.JMenu;
import javax.swing.JMenuBar;

import org.springframework.beans.factory.annotation.Required;

import eu.dnetlib.dlms.swing.DorotyMainFrame;

public class MenuBar extends JMenuBar implements ActionListener {
	
	private static final long serialVersionUID = -6525908910420913532L;
	private DorotyMainFrame dorotyMainFrame;
	
	private Map<String, JMenu> menus = new HashMap<String, JMenu>();
	
	public MenuBar() {
		super();
	}
	
	@Required
	public void setMenuItems(List<AbstractMenuItem> items) {
		for(AbstractMenuItem item : items) {
			addItem(item);
		}
	}

	private void addItem(AbstractMenuItem item) {
		JMenu menu = obtainMenu(item.getPath());
		if (item instanceof SeparatorItem) {
			menu.addSeparator();
		} else {
			menu.add(item);
			item.addActionListener(this);
		}
	}

	private JMenu obtainMenu(String path) {
		if (menus.containsKey(path)) {
			return menus.get(path);
		} 
		
		JMenu menu;
		String[] arr = path.split("\\/");
		if (arr.length == 0) {
			menu = new JMenu();
		} else if (arr.length == 1) {
			menu = new JMenu(arr[0]);
			add(menu);
		} else {
			JMenu parent = obtainMenu(path.substring(0, path.lastIndexOf("/")));
			menu = new JMenu(path.substring(path.lastIndexOf("/") + 1));
			parent.add(menu);
		}
		menus.put(path, menu);
		return menu;
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() instanceof AbstractMenuItem) {
			((AbstractMenuItem) e.getSource()).execute(dorotyMainFrame);
		}
	}

	public DorotyMainFrame getDorotyMainFrame() {
		return dorotyMainFrame;
	}

	public void setDorotyMainFrame(DorotyMainFrame dorotyMainFrame) {
		this.dorotyMainFrame = dorotyMainFrame;
	}
	
}
