package surface.classeditor;

import hu.swankey.ammo.common.script.yunits.YClass;
import hu.swankey.ammo.common.script.yunits.YMethod;
import hu.swankey.ammo.common.yggdrasil.definition.ClassDefinition;
import hu.swankey.ammo.common.yggdrasil.definition.MethodDefinition;

import java.awt.Color;
import java.awt.Component;
import java.util.List;
import java.util.Map;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;
import javax.swing.UIManager;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import adapters.MethodListModel;
import background.Controller;

public class MethodList extends JList {

	private static final long serialVersionUID = 1L;
	
	private ImageIcon iconBrick = new ImageIcon(getClass().getResource("/icons/brick.png"));
	
	public static MethodList create(Controller controller){
		MethodList fieldlist = new MethodList(controller);
		return fieldlist;
	}
	
	public MethodList(final Controller controller){
		setCellRenderer( new FieldNodeRenderer() );		
	    
	    addListSelectionListener( new ListSelectionListener(){
			@Override
			public void valueChanged(ListSelectionEvent e) {
				if (getSelectedValue() != null)
					controller.setSecondaryElement((MethodDefinition)getSelectedValue());
			}		
		} );		
	}
	
	public YClass getYClass(){
		return ((MethodListModel)getModel()).getYClass();
	}	
	
	private class FieldNodeRenderer implements ListCellRenderer {
		
		private JPanel nodeRenderer = new JPanel();		

		private Color selectionForeground = UIManager.getColor("Tree.selectionForeground");
		private Color selectionBackground = UIManager.getColor("Tree.selectionBackground");
		private Color textForeground = UIManager.getColor("Tree.textForeground");
		
		private JLabel label_name = new JLabel();
		private JLabel label_superior = new JLabel();
		
		public FieldNodeRenderer(){
			nodeRenderer.setOpaque(true);
		    nodeRenderer.setLayout( new BoxLayout(nodeRenderer, BoxLayout.X_AXIS) );
		    
		    label_name.setBorder( BorderFactory.createEmptyBorder(1, 0, 1, 3) );
		    label_superior.setForeground( Color.GRAY );
		} 

		@Override
		public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
						
		    if (isSelected) {
		    	nodeRenderer.setForeground(selectionForeground);
		        nodeRenderer.setBackground(selectionBackground);
		    } else {
		        nodeRenderer.setForeground(textForeground);
		        nodeRenderer.setBackground(null);
		    }
		    
		    nodeRenderer.removeAll();
		    YMethod method = ((MethodDefinition) value).getWrapped();
		    
		    // Class icon:
		    JLabel icon = new JLabel( iconBrick );
		    icon.setBorder( BorderFactory.createEmptyBorder(1, 0, 1, 3) );
		    nodeRenderer.add(icon );
		    
		    // Signature text:
		    Map<String, YClass> signature = method.getParameters();
		    String signStr = "";
		    for(String paramName: signature.keySet()) {
		    	if (!signStr.equals("")) signStr += ", ";
		    	signStr += paramName + ": " + signature.get(paramName).getName();
		    }
		    
		    // A jelenlegi betűtípussal szóköz nélkül a két zárójel összecsúszik és hülyén néz ki
		    if (signStr.equals(""))
		    	signStr += " ";
		    
		    // YClass text:
		    String yclassStr = (method.getReturnType() == null? "void" : method.getReturnType().getName());
		    
		    // Title:
		    List<YMethod>  methods = getYClass().getMethods(method.getName());		    
		    boolean inherited = (methods == null || !methods.contains(method));
		    
		    label_name = new JLabel(yclassStr + " " + method.getName() + "(" + signStr + ")");
		    label_name.setForeground( inherited ? Color.BLACK : Color.BLUE);
		    nodeRenderer.add( label_name );
		    
		    // Superior:
		    if (inherited) {
		    	//YClass owner = ((ClassDefinition)method.getWrapperElement().getParent().getParent().getParent()).getWrapped();
		    	YClass owner = ((ClassDefinition)method.getWrapperElement().getLogicalParent()).getWrapped();
		    	label_superior.setText(" (" + owner.getPathString() + ")");
		    	nodeRenderer.add( label_superior );
		    }		    

		    return nodeRenderer;
		  }

	}	

}
