import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Vector;
import javax.swing.JComboBox;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JRadioButton;
import javax.swing.JLabel;
import javax.swing.JSeparator;
import javax.swing.JTextField;
import javax.swing.JSpinner;
import javax.swing.JCheckBox;
import javax.swing.SwingConstants;

/** Esta clase implementará un panel que mostrara todos los datos unidos.
 */
public class Contenedor extends JPanel{

    private EditorUsuario editor = new EditorUsuario();
    private static JMenuBar menuBar;
    private JMenu menuCargar;
    private JPanel columna1;
    private JLabel name1;
    private JLabel carrera1;
    private JSpinner semestre1;
    private JButton procesa;
    private JRadioButton sm1;
    private JRadioButton sm2;
    private JSpinner maxR1;
    private JSpinner maxC1;
    private JPanel columna2;
    private JLabel sigla1;
    private JCheckBox aprueba;
    private Tabla tabla1 = new Tabla();
    private Tabla tabla2 = new Tabla();
    private static final long serialVersionUID=3;
	
	/** Constructor de la clase
     */
	public Contenedor(){
		
		JMenuItem menuItem;
		
		menuBar = new JMenuBar ();
		JMenu menuOpciones = new JMenu ("Opciones");
		menuOpciones.setMnemonic (KeyEvent.VK_O);

		menuItem = new JMenuItem ("Nuevo Usuario");
		menuItem.setMnemonic (KeyEvent.VK_N);
		menuItem.addActionListener (new DialogoUsuario ());
		menuOpciones.add (menuItem);
		
		menuItem = new JMenuItem ("Guardar Usuario");
		menuItem.setMnemonic (KeyEvent.VK_G);
		menuItem.addActionListener (new Guarda());
		menuOpciones.add(menuItem);

		menuCargar = new JMenu ("Cargar Usuario");
		menuCargar.setMnemonic (KeyEvent.VK_C);
		menuOpciones.add (menuCargar);
		
		ArrayList < String > usuarios = new ArrayList < String > ();
		usuarios = Datos.getUsuarios();
		for (int i=0; i<usuarios.size(); i++)
			addUsuario((String)usuarios.get(i));
		
		menuBar.add (menuOpciones);
		
		columna1 = new ColumnaUsuario();
		name1 = (JLabel)columna1.getComponent(1);
		carrera1 = (JLabel)columna1.getComponent(2);
		semestre1 = (JSpinner)columna1.getComponent(3);
		sm1 = (JRadioButton)columna1.getComponent(4);
		sm2 = (JRadioButton)columna1.getComponent(5);
		maxR1 = (JSpinner)columna1.getComponent(6);
		maxC1 = (JSpinner)columna1.getComponent(7);
		procesa = (JButton)columna1.getComponent(8);
		procesa.addActionListener(new Proceso());
		
		columna2 = new ColumnaRamo();
		sigla1 = (JLabel)columna2.getComponent(1);
		aprueba = (JCheckBox)columna2.getComponent(2);
		aprueba.addActionListener(new Aprueba());
		
		JSeparator barra = new JSeparator(SwingConstants.VERTICAL);
		barra.setLocation(196,0);
		barra.setSize(5,300);
		
		JSeparator barra2 = new JSeparator(SwingConstants.HORIZONTAL);
		barra2.setLocation(197,150);
		barra2.setSize(605,5);

		JSeparator barra3 = new JSeparator(SwingConstants.VERTICAL);
		barra3.setLocation(804,0);
		barra3.setSize(5,300);

		setSize(1000, 350);
		
		setLayout(null);
		add(columna1);
		add(barra);
		add(barra2);
		add(barra3);
		add(columna2);
	}

	/** Metodo que retorna una barra de menu
     * @return menuBar
     */
	public JMenuBar getMenu(){
		return menuBar;
	}
	
	private void addUsuario(String nombre){
		JMenuItem menuItem = new JMenuItem (nombre);
		menuItem.addActionListener (new Carga(nombre));
		menuCargar.add(menuItem);
	}
	
	private void mostrarTabla(boolean t){
		Vector < Vector > rowData = new Vector <Vector> ();
		Vector < Celda > data = new Vector < Celda > ();
		String [] columna;
		Object [][] filas;
		ArrayList < ArrayList > semestres = editor.getSemestres(t);
		int x = editor.getNumeroRamos(t);
		int h = 0;
		int k = 0;
		while (h<x){
			data.clear();
			for (int i=0; i<semestres.size(); i++){
				try{
					data.add((Celda)((ArrayList)semestres.get(i)).get(k));
					h++;
				}
				catch (IndexOutOfBoundsException e)
				{
					data.add(new Celda(false," "));
				}
			}
			rowData.add((Vector)data.clone());
			k++;
		}
		if (t){
			columna = new String [semestres.size()];
			filas = new Object [k][semestres.size()];
			for (int i=0; i<semestres.size(); i++){
				columna[i] = ("Semestre " + (i + 1));
				for (int j=0; j<k; j++){
					filas[j][i] = ((Vector)rowData.get(j)).get(i);
				}
			}
			remove(tabla1);
			Tabla tabla1 = new Tabla(filas, columna, t);
			tabla1.setLocation(200,2);
			add(tabla1, 1);
		}
		else{
			columna = new String [semestres.size()];
			filas = new Object [k][semestres.size()];
			for (int i=0; i<semestres.size(); i++){
				columna[i] = ("Semestre " + (i + Integer.valueOf(semestre1.getValue().toString())));
				for (int j=0; j<k; j++){
					filas[j][i] = ((Vector)rowData.get(j)).get(i);
				}
			}
			remove(tabla2);
			Tabla tabla2 = new Tabla(filas, columna, t);
			tabla2.setLocation(200,152);
			add(tabla2, 2);
		}
		MallaMatic.visible();
	}
	
	private class DialogoUsuario implements ActionListener{

		/**
		 * Constructor de la clase.
		 */
		public DialogoUsuario() {
		}

		/**
		 * Metodo que implementa la inserciÃ³n del usuario.
		 */
		public void actionPerformed(ActionEvent e) {
			String nombre;
			int carrera;
			
			Object[] message = new Object[4]; 
            message[0] = "Ingresar Nombre"; 
            message[1] = new JTextField("");
            message[2] = "Escoja su carrera"; 

            JComboBox cb = new JComboBox();
            cb.setPrototypeDisplayValue("Escoja su carrera");
            ArrayList < String > carreras = Datos.getCarreras();
            for (int i=0; i<carreras.size(); i++)
            	cb.addItem((String)carreras.get(i)); 

            message[3] = cb; 

            String[] options = { 
         		    "Ingresar",
         		    "Cancelar"
         		}; 
            
			int result = JOptionPane.showOptionDialog( 
		 		    null, 
		 		    message, 
		 		    "Ingresar Datos", 
		 		    JOptionPane.DEFAULT_OPTION, 
		 		    JOptionPane.INFORMATION_MESSAGE, 
		 		    null,
		 		    options,
		 		    options[0] 
		 		); 
	 		switch(result) { 
	 		   case 0:
	 			  nombre = ((JTextField)message[1]).getText();
	 			   if (nombre.equals("")){
	 				   JOptionPane.showMessageDialog(
	 						   null,
	 						   "Debe insertar un nombre.",
	 						   "Error",
	 						   JOptionPane.WARNING_MESSAGE);
	 				   break;
	 			   }
	 			   carrera = ((JComboBox)message[3]).getSelectedIndex();
	 			   name1.setText(nombre);
	 			   carrera1.setText((String)((JComboBox)message[3]).getSelectedItem());
	 			   editor.creaUsuario(nombre, carrera);
	 			   mostrarTabla(true);
	 			   semestre1.setEnabled(true);
	 			   procesa.setEnabled(true);
	 			   sm1.setEnabled(true);
	 			   sm2.setEnabled(true);
	 			   maxR1.setEnabled(true);
	 			   maxC1.setEnabled(true);
	 			   ColumnaRamo.desactualizarRamo();
	 			   break; 
	 		   case 1:
	 			   break;
	 		   default: 
	 			   break; 
	 		}
		}
	}
	
	private class Proceso implements ActionListener{

		/**
		 * Constructor de la clase.
		 */
		public Proceso() {
		}

		/**
		 * Metodo que implementa la inserciÃ³n del usuario.
		 */
		public void actionPerformed(ActionEvent e) {
			int s;
			if (sm1.isSelected())
				s = 1;
			else
				s = 2;
			editor.ordenarSemestresporPeso(s,Integer.parseInt(maxC1.getValue().toString()),Integer.parseInt(maxR1.getValue().toString()));
			mostrarTabla(false);
			mostrarTabla(true);
			ColumnaRamo.desactualizarRamo();
		}
	}
	
	private class Aprueba implements ActionListener{
		public Aprueba(){
			
		}
		
		public void actionPerformed(ActionEvent e) {
			editor.setRamo(sigla1.getText());
			tabla1.setCelda(aprueba.isSelected());
		}
	}

	private class Carga implements ActionListener{
		String nombre;
		public Carga(String nombre){
			this.nombre = nombre;
		}
		
		public void actionPerformed(ActionEvent e) {
			editor.cargarUsuario(nombre);
			name1.setText(nombre);
			carrera1.setText(Datos.getCarreras().get(editor.getCarrera()));
			mostrarTabla(true);
			semestre1.setEnabled(true);
			procesa.setEnabled(true);
			sm1.setEnabled(true);
			sm2.setEnabled(true);
			maxR1.setEnabled(true);
			maxC1.setEnabled(true);
			ColumnaRamo.desactualizarRamo();
		}
	}
	
	private class Guarda implements ActionListener{
		public Guarda(){
		}
		
		public void actionPerformed(ActionEvent e) {
			editor.guardarUsuario();
			int i = Datos.getUsuarios().size();
			addUsuario(Datos.getUsuarios().get(i-1));
		}
	}
}
