package de.hhu.ba.yoshikoWrapper.gui;


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;

import org.cytoscape.application.CyApplicationManager;
import org.cytoscape.model.CyColumn;
import org.cytoscape.model.CyNetwork;

import de.hhu.ba.yoshikoWrapper.core.Core;

@SuppressWarnings("serial") //will never be serialized
public class ColumnMapper extends ComfortPanel{
	
	//Symbolic links
	private CyApplicationManager cy;
	
	//Swing components
	private JComboBox<CyColumn> editingCostMapper;
	private JComboBox<CyColumn> permanentMapper;
	private JComboBox<CyColumn> forbiddenMapper;
		
	private JCheckBox useMappingCost;
	private JCheckBox useMappingPerm;
	private JCheckBox useMappingForb;
	
	private JButton updateColumns;
	
	public ColumnMapper() {
		this.setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));
		cy = Core.getApplicationManager();

		//SWING COMPONENTS
		editingCostMapper = new JComboBox<CyColumn>();
		permanentMapper = new JComboBox<CyColumn>();
		forbiddenMapper = new JComboBox<CyColumn>();

		useMappingCost = new JCheckBox("Map modification costs");
		useMappingPerm = new JCheckBox("Map edges as permanent");
		useMappingForb = new JCheckBox("Map edges as forbidden");
		
		updateColumns = new JButton("Update Columns!");
		
		this.addAll(useMappingCost,editingCostMapper,useMappingPerm,permanentMapper,useMappingForb,forbiddenMapper,updateColumns);
		//Initial call to get table values
		updateValues();
		//Add a focus listener to update values
		updateColumns.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				updateValues(); //shitty temporary solution
			}
			
		});


	}
	
	public void updateValues() {
		
		CyNetwork net = cy.getCurrentNetwork();

		if (net != null) { //Check if a network is loaded
	
			//Clear entries
			editingCostMapper.removeAllItems();
			for (CyColumn c : net.getDefaultEdgeTable().getColumns()){
				//Only add columns with numeric values
				if (c.getType() == Integer.class || c.getType() == Double.class) {
					editingCostMapper.addItem(c);
				}
			}
			
			forbiddenMapper.removeAllItems();
			for (CyColumn c : net.getDefaultEdgeTable().getColumns()){
				//Only add columns with boolean values
				if (c.getType() == Boolean.class) {
					forbiddenMapper.addItem(c);
				}
			}
			
			permanentMapper.removeAllItems();
			for (CyColumn c : net.getDefaultEdgeTable().getColumns()){
				//Only add columns with boolean values
				if (c.getType() == Boolean.class) {
					permanentMapper.addItem(c);
				}
			}
		
		}
	}
	
	public CyColumn getEditingCostColumn() {
		if (useMappingCost.isSelected()) {
			return editingCostMapper.getItemAt(editingCostMapper.getSelectedIndex());
		}
		return null;
	}
	
	public CyColumn getForbiddenColumn() {
		if (useMappingForb.isSelected()) {
			return forbiddenMapper.getItemAt(forbiddenMapper.getSelectedIndex());
		}
		return null;
	}
	
	public CyColumn getPermanentColumn() {
		if (useMappingPerm.isSelected()) {
			return permanentMapper.getItemAt(permanentMapper.getSelectedIndex());
		}
		return null;
	}

}