package actions;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.UnsupportedEncodingException;
import java.util.ResourceBundle;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JColorChooser;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.colorchooser.AbstractColorChooserPanel;
import javax.swing.colorchooser.ColorSelectionModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import org.apache.log4j.Logger;

import utils.Constantes;
import utils.Fuentes;
import utils.Utilidades;
import business.Configuracion;
import business.Resultados;
import core.PanelEdicion;

public class OpcionesAction implements ActionListener {
	
	private static Logger logger = Logger.getLogger(OpcionesAction.class);

	private PanelEdicion panelEdicion;

	public OpcionesAction (PanelEdicion pEdicion) {
		panelEdicion = pEdicion;
	}

	public void actionPerformed(ActionEvent e) {
		ModalOpciones modal = new ModalOpciones();
		modal.setVisible(true);
	}

	private class ModalOpciones extends JDialog {

		private static final long serialVersionUID = 0x5ca08341bd8568a6L;
		private ResourceBundle mensajes;
		private JColorChooser selectorColor = new JColorChooser();
		private JTextField colorMuestra = new JTextField();
		private JTextField colorVerticeMuestra = new JTextField();
		private JTextField colorVerticeSeleccionadoMuestra = new JTextField();
		private JTextField colorVerticeSolucionMuestra = new JTextField();
		private JTextField colorAristaMuestra = new JTextField();
		private JTextField colorAristaSeleccionadaMuestra = new JTextField();
		private JTextField colorAristaSolucionMuestra = new JTextField();
		private ButtonGroup grupoRadio = new ButtonGroup();
		private JRadioButton cambiarVertice = new JRadioButton();
		private JRadioButton cambiarVerticeSeleccionado = new JRadioButton();
		private JRadioButton cambiarVerticeSolucion = new JRadioButton();
		private JRadioButton cambiarArista = new JRadioButton();
		private JRadioButton cambiarAristaSeleccionada = new JRadioButton();
		private JRadioButton cambiarAristaSolucion = new JRadioButton();
		private JLabel texto1 = new JLabel();
		private JCheckBox opcion1 = new JCheckBox();
		private JLabel texto2 = new JLabel();
		private JCheckBox opcion2 = new JCheckBox();
		private JLabel texto3 = new JLabel();
		private JTextField opcion3A = new JTextField();
		private JTextField opcion3B = new JTextField();
		private JLabel validacionArriba = new JLabel();
		private JLabel validacionAbajo = new JLabel();


		private ModalOpciones() {
			mensajes = panelEdicion.getMensajes();
			construirPanel();
		}


		private void construirPanel() {
			JTabbedPane pestaņas = new JTabbedPane();
			JPanel pestaņaGeneral = new JPanel();
			JPanel pestaņaColores = new JPanel();
			JPanel panelMuestra = new JPanel();
			JPanel panelRadio = new JPanel();
			JLabel colorVertice = new JLabel();
			JLabel colorVerticeSeleccionado = new JLabel();
			JLabel colorVerticeSolucion = new JLabel();
			JLabel colorArista = new JLabel();
			JLabel colorAristaSeleccionada = new JLabel();
			JLabel colorAristaSolucion = new JLabel();
			JButton botonAceptar = new JButton();
			JButton botonCancelar = new JButton();
			JButton botonAplicar = new JButton();
			String general = "";
			String colores = "";

			colorVerticeMuestra.setFocusable(false);
			colorVerticeMuestra.setEditable(false);
			colorVerticeSeleccionadoMuestra.setFocusable(false);
			colorVerticeSeleccionadoMuestra.setEditable(false);
			colorVerticeSolucionMuestra.setFocusable(false);
			colorVerticeSolucionMuestra.setEditable(false);
			colorAristaMuestra.setFocusable(false);
			colorAristaMuestra.setEditable(false);
			colorAristaSeleccionadaMuestra.setFocusable(false);
			colorAristaSeleccionadaMuestra.setEditable(false);
			colorAristaSolucionMuestra.setFocusable(false);
			colorAristaSolucionMuestra.setEditable(false);


			try {
				setTitle(new String(mensajes.getString("opciones").getBytes("ISO-8859-1"),"UTF-8"));
				general = new String(mensajes.getString("general").getBytes("ISO-8859-1"),"UTF-8");
				colores = new String(mensajes.getString("Colores").getBytes("ISO-8859-1"),"UTF-8");
				texto1.setText(new String(mensajes.getString("ActivarConfirmacion").getBytes("ISO-8859-1"),"UTF-8"));
				texto2.setText(new String(mensajes.getString("ActivarArbol").getBytes("ISO-8859-1"),"UTF-8"));
				texto3.setText(new String(mensajes.getString("Desplazamiento3D").getBytes("ISO-8859-1"),"UTF-8"));
				colorVertice.setText(new String(mensajes.getString("vertice").getBytes("ISO-8859-1"),"UTF-8"));
				colorVerticeSeleccionado.setText(new String(mensajes.getString("SelNodo").getBytes("ISO-8859-1"),"UTF-8"));
				colorVerticeSolucion.setText(new String(mensajes.getString("verticeSolucion").getBytes("ISO-8859-1"),"UTF-8"));
				colorArista.setText(new String(mensajes.getString("Arista").getBytes("ISO-8859-1"),"UTF-8"));
				colorAristaSeleccionada.setText(new String(mensajes.getString("SelAris").getBytes("ISO-8859-1"),"UTF-8"));
				colorAristaSolucion.setText(new String(mensajes.getString("aristaSolucion").getBytes("ISO-8859-1"),"UTF-8"));
				botonAceptar.setText(new String(mensajes.getString("Aceptar").getBytes("ISO-8859-1"),"UTF-8"));
				botonCancelar.setText(new String(mensajes.getString("Cancelar").getBytes("ISO-8859-1"),"UTF-8"));
				botonAplicar.setText(new String(mensajes.getString("aplicar").getBytes("ISO-8859-1"),"UTF-8"));
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}

			if(!mensajes.getLocale().getLanguage().equals("zh")) {
				texto1.setFont(Fuentes.Fuente2);
				texto2.setFont(Fuentes.Fuente2);
				texto3.setFont(Fuentes.Fuente2);
				validacionArriba.setFont(Fuentes.Fuente4);
				validacionAbajo.setFont(Fuentes.Fuente4);
				colorVertice.setFont(Fuentes.Fuente2);
				colorVerticeSeleccionado.setFont(Fuentes.Fuente2);
				colorVerticeSolucion.setFont(Fuentes.Fuente2);
				colorArista.setFont(Fuentes.Fuente2);
				colorAristaSeleccionada.setFont(Fuentes.Fuente2);
				colorAristaSolucion.setFont(Fuentes.Fuente2);
			} else {
				texto1.setFont(Fuentes.Fuente0);
				texto2.setFont(Fuentes.Fuente0);
				texto3.setFont(Fuentes.Fuente0);
				validacionArriba.setFont(Fuentes.Fuente5);
				validacionAbajo.setFont(Fuentes.Fuente5);
				colorVertice.setFont(Fuentes.Fuente0);
				colorVerticeSeleccionado.setFont(Fuentes.Fuente0);
				colorVerticeSolucion.setFont(Fuentes.Fuente0);
				colorArista.setFont(Fuentes.Fuente0);
				colorAristaSeleccionada.setFont(Fuentes.Fuente0);
				colorAristaSolucion.setFont(Fuentes.Fuente0);
			}


			colorMuestra.setBounds(0, 0, 245, 50);
			colorMuestra.setFocusable(false);
			colorMuestra.setEditable(false);
			colorMuestra.setBackground(new Color(189,250,107));
			panelMuestra.setBounds(15, 235, 245, 50);
			panelMuestra.setLayout(null);
			panelMuestra.add(colorMuestra);


			AbstractColorChooserPanel[] panelesColor = selectorColor.getChooserPanels();
			selectorColor.removeChooserPanel(panelesColor[0]);
			selectorColor.removeChooserPanel(panelesColor[2]);
			selectorColor.setBounds(12, 12, 350, 220);
			selectorColor.setPreviewPanel(panelMuestra);
			selectorColor.setLocale(mensajes.getLocale());
			selectorColor.setColor(new Color(189,250,107));
			for (int i = 0; i < selectorColor.getComponentCount(); i++) {
				selectorColor.getComponent(i).setBackground(new Color(189,250,107));
			}


			colorVerticeMuestra.setBackground(Configuracion.getColorVertice());
			colorVerticeSeleccionadoMuestra.setBackground(Configuracion.getColorVerticeSeleccionado());
			colorVerticeSolucionMuestra.setBackground(Configuracion.getColorVerticeSolucion());
			colorAristaMuestra.setBackground(Configuracion.getColorArista());
			colorAristaSeleccionadaMuestra.setBackground(Configuracion.getColorAristaSeleccionada());
			colorAristaSolucionMuestra.setBackground(Configuracion.getColorAristaSolucion());
			colorVerticeMuestra.setBounds(0, 0, 20, 25);
			colorVertice.setBounds(25, 0, 200, 25);
			cambiarVertice.setBounds(175, 0, 20, 25);
			colorVerticeSeleccionadoMuestra.setBounds(0, 30, 20, 25);
			colorVerticeSeleccionado.setBounds(25, 30, 200, 25);
			cambiarVerticeSeleccionado.setBounds(175, 30, 20, 25);
			colorVerticeSolucionMuestra.setBounds(0, 60, 20, 25);
			colorVerticeSolucion.setBounds(25, 60, 200, 25);
			cambiarVerticeSolucion.setBounds(175, 60, 20, 25);
			colorAristaMuestra.setBounds(0, 90, 20, 25);
			colorArista.setBounds(25, 90, 200, 25);
			cambiarArista.setBounds(175, 90, 20, 25);
			colorAristaSeleccionadaMuestra.setBounds(0, 120, 20, 25);
			colorAristaSeleccionada.setBounds(25, 120, 200, 25);
			cambiarAristaSeleccionada.setBounds(175, 120, 20, 25);
			colorAristaSolucionMuestra.setBounds(0, 150, 20, 25);
			colorAristaSolucion.setBounds(25, 150, 200, 25);
			cambiarAristaSolucion.setBounds(175, 150, 20, 25);
			grupoRadio.add(cambiarVertice);
			grupoRadio.add(cambiarVerticeSeleccionado);
			grupoRadio.add(cambiarVerticeSolucion);
			grupoRadio.add(cambiarArista);
			grupoRadio.add(cambiarAristaSeleccionada);
			grupoRadio.add(cambiarAristaSolucion);
			panelRadio.setBounds(375, 30, 195, 180);
			panelRadio.setLayout(null);
			panelRadio.add(colorVerticeMuestra);
			panelRadio.add(colorVertice);
			panelRadio.add(cambiarVertice);
			panelRadio.add(colorVerticeSeleccionadoMuestra);
			panelRadio.add(colorVerticeSeleccionado);
			panelRadio.add(cambiarVerticeSeleccionado);
			panelRadio.add(colorVerticeSolucionMuestra);
			panelRadio.add(colorVerticeSolucion);
			panelRadio.add(cambiarVerticeSolucion);
			panelRadio.add(colorAristaMuestra);
			panelRadio.add(colorArista);
			panelRadio.add(cambiarArista);
			panelRadio.add(colorAristaSeleccionadaMuestra);
			panelRadio.add(colorAristaSeleccionada);
			panelRadio.add(cambiarAristaSeleccionada);
			panelRadio.add(colorAristaSolucionMuestra);
			panelRadio.add(colorAristaSolucion);
			panelRadio.add(cambiarAristaSolucion);


			botonAceptar.setName("Aceptar");
			botonCancelar.setName("Cancelar");
			botonAplicar.setName("Aplicar");
			botonAceptar.setBounds(160, 335, 85, 28);
			botonCancelar.setBounds(260, 335, 85, 28);
			botonAplicar.setBounds(360, 335, 85, 28);


			texto1.setBounds(15, 25, 400, 20);
			opcion1.setBounds(500, 25, 20, 20);
			opcion1.setSelected(Configuracion.isPanelesConfirmacion());
			texto2.setBounds(15, 75, 400, 20);
			opcion2.setBounds(500, 75, 20, 20);
			opcion2.setSelected(Configuracion.isModoArbol());
			texto3.setBounds(15, 125, 400, 20);
			opcion3A.setBounds(432, 125, 40, 20);
			opcion3A.setHorizontalAlignment(JTextField.CENTER);
			opcion3A.setText(Configuracion.getX3D().toString());
			opcion3B.setBounds(482, 125, 40, 20);
			opcion3B.setHorizontalAlignment(JTextField.CENTER);
			opcion3B.setText(Configuracion.getY3D().toString());
			validacionArriba.setForeground(new Color(255,0,0));
			validacionArriba.setVisible(false);
			validacionArriba.setBounds(15, 205, 550, 20);
			validacionArriba.setHorizontalAlignment(JTextField.CENTER);
			validacionAbajo.setForeground(new Color(255,0,0));
			validacionAbajo.setVisible(false);
			validacionAbajo.setBounds(15, 235, 550, 20);
			validacionAbajo.setHorizontalAlignment(JTextField.CENTER);
			pestaņaGeneral.setLayout(null);
			pestaņaGeneral.add(texto1);
			pestaņaGeneral.add(opcion1);
			pestaņaGeneral.add(texto2);
			pestaņaGeneral.add(opcion2);
			pestaņaGeneral.add(texto3);
			pestaņaGeneral.add(opcion3A);
			pestaņaGeneral.add(opcion3B);
			pestaņaGeneral.add(validacionArriba);
			pestaņaGeneral.add(validacionAbajo);
			pestaņaColores.setLayout(null);
			pestaņaColores.add(selectorColor);
			pestaņaColores.add(panelMuestra);
			pestaņaColores.add(panelRadio);


			pestaņas.setBounds(12, 12, 600, 320);
			pestaņas.addTab(colores, null, pestaņaColores, null);
			pestaņas.addTab(general, null, pestaņaGeneral, null);
			for (int i = 0; i < pestaņas.getTabCount(); i++) {
				pestaņas.getComponentAt(i).setBackground(new Color(189,250,107));
			}


			getContentPane().add(pestaņas);
			getContentPane().add(botonAceptar);
			getContentPane().add(botonCancelar);
			getContentPane().add(botonAplicar);
			getContentPane().setBackground(new Color(189,250,107));
			getContentPane().setLayout(null);


			setSize(600, 400);
			setResizable(false);
			Toolkit kit = Toolkit.getDefaultToolkit();
			Dimension dim = kit.getScreenSize();
			setLocation(dim.width / 2 - getWidth() / 2, dim.height / 2 - getHeight() / 2);


			ActionListener botones = new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					Object obj = e.getSource();
					if (obj instanceof JButton) {
						if(((JButton)obj).getName().equals("Aceptar")) {
							if(aplicar()) {
								cancelar();
							}
						} else if(((JButton)obj).getName().equals("Cancelar")) {
							cancelar();
						} else if(((JButton)obj).getName().equals("Aplicar")) {
							aplicar();
						}
					} else if (obj instanceof JTextField) {
						if(aplicar()) {
							cancelar();
						}
					}
				}
			};
			ColorSelectionModel model = selectorColor.getSelectionModel();
			model.addChangeListener(new ChangeListener() {
				public void stateChanged(ChangeEvent evt) {
					ColorSelectionModel model = (ColorSelectionModel) evt.getSource();
					colorMuestra.setBackground(model.getSelectedColor());
				}
			});

			botonAceptar.addActionListener(botones);
			botonCancelar.addActionListener(botones);
			botonAplicar.addActionListener(botones);
		}

		public boolean aplicar() {
			boolean res = true;
			if(cambiarVertice.isSelected()) {
				Configuracion.setColorVertice(selectorColor.getColor());
				colorVerticeMuestra.setBackground(selectorColor.getColor());
			} else if(cambiarVerticeSeleccionado.isSelected()) {
				Configuracion.setColorVerticeSeleccionado(selectorColor.getColor());
				colorVerticeSeleccionadoMuestra.setBackground(selectorColor.getColor());
			} else if(cambiarVerticeSolucion.isSelected()) {
				Configuracion.setColorVerticeSolucion(selectorColor.getColor());
				colorVerticeSolucionMuestra.setBackground(selectorColor.getColor());
			} else if(cambiarArista.isSelected()) {
				Configuracion.setColorArista(selectorColor.getColor());
				colorAristaMuestra.setBackground(selectorColor.getColor());
			} else if(cambiarAristaSeleccionada.isSelected()) {
				Configuracion.setColorAristaSeleccionada(selectorColor.getColor());
				colorAristaSeleccionadaMuestra.setBackground(selectorColor.getColor());
			} else if(cambiarAristaSolucion.isSelected()) {
				Configuracion.setColorAristaSolucion(selectorColor.getColor());
				colorAristaSolucionMuestra.setBackground(selectorColor.getColor());
			}
			grupoRadio.clearSelection();
			Configuracion.setPanelesConfirmacion(opcion1.isSelected());
			if(opcion2.isSelected()) {
				String val = validacionesModoArbol();
				if (val.equals("")) {
					Configuracion.setModoArbol(true);
					validacionArriba.setVisible(false);
				} else {
					mostrarValidacion(val, false);
					res = false;
				}
			} else {
				Configuracion.setModoArbol(false);
				validacionArriba.setVisible(false);
			}
			try {
				Configuracion.setX3D(Integer.valueOf(opcion3A.getText()));
				Configuracion.setY3D(Integer.valueOf(opcion3B.getText()));
				validacionAbajo.setVisible(false);
			} catch (Exception e){
				mostrarValidacion("validacion7", true);
				res = false;
			}
			if(!validacionAbajo.isVisible() && (Integer.valueOf(opcion3A.getText()) < -Constantes.PANEL_ANCHO || Integer.valueOf(opcion3A.getText()) > Constantes.PANEL_ANCHO
					|| Integer.valueOf(opcion3B.getText()) < -Constantes.PANEL_ALTO || Integer.valueOf(opcion3B.getText()) > Constantes.PANEL_ALTO)) {
				mostrarValidacion("validacion3", true);
				res = false;
			}

			return res;
		}

		public void cancelar() {
			setVisible(false);
			dispose();
		}

		public void mostrarValidacion(String texto, boolean abajo) {
			try {
				if (abajo) {
					validacionAbajo.setVisible(true);
					validacionAbajo.setText(new String(mensajes.getString(texto).getBytes("ISO-8859-1"),"UTF-8"));
				} else {
					validacionArriba.setVisible(true);
					validacionArriba.setText(new String(mensajes.getString(texto).getBytes("ISO-8859-1"),"UTF-8"));
				}
				logger.error("Error al cambiar opciones");
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
		}

		public String validacionesModoArbol() {
			String res = "";
			int numeroVertices = panelEdicion.getGrafo().getVertices().size();
			int matrizDistancias[][];
			if(Resultados.getMatriz() == null) {
				matrizDistancias = new int[numeroVertices][numeroVertices];
				Utilidades.CalcularMatriz(matrizDistancias, panelEdicion.getGrafo());
				Resultados.setMatriz(matrizDistancias);
			} else {
				matrizDistancias = Resultados.getMatriz();
			}
			try {
				for(int f = 0; f < matrizDistancias.length; f++) {
					for(int c = 0; c < matrizDistancias.length; c++)
						if((matrizDistancias[f][c] == 0 || matrizDistancias[f][c] == -1) && f != c)
							throw new Exception();
				}
			} catch(Exception exc) {
				Resultados.setMatriz((int[][])null);
				return "validacion9";
			} try {
				if(Utilidades.existeCiclo(panelEdicion.getGrafo()))
					throw new Exception();
			} catch(Exception exc2) {
				res = "validacion8";
			}
			return res;
		}
	}
}