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.JDialog;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.SwingConstants;

import org.apache.log4j.Logger;

import utils.Constantes;
import utils.Fuentes;
import utils.Utilidades;
import business.Aleatorio;
import business.Arbol;
import business.Ciclo;
import business.Completo;
import business.Configuracion;
import business.Estrella;
import business.Resultados;
import business.Rueda;
import core.Aplicacion;
import core.ModalAceptar;
import core.PanelEdicion;
import core.PanelInfo;

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

	private Aplicacion aplicacion;
	private PanelEdicion panelEdicion;
	private PanelInfo panelInfo;

	public NuevoAction (Aplicacion a) {
		aplicacion = a;
		panelEdicion = Aplicacion.getPanelEdicion();
		panelInfo = Aplicacion.getPanelInfo();
	}

	public void actionPerformed(ActionEvent e) {
		JButton b = new JButton();
		JMenuItem m = new JMenuItem();
		if (e.getSource() instanceof JButton) {
			b = (JButton) e.getSource();
			m.setName("");
		} else if (e.getSource() instanceof JMenuItem) {
			b.setName("");
			m = (JMenuItem) e.getSource();
		}

		if(panelInfo.getModoEscritura().isEnabled()) {
			if (b.getName().equals("Grafo") || m.getName().equals("Grafo")) {
				if(Configuracion.isModoArbol()) {
					ModalAceptar modal = new ModalAceptar(panelEdicion.getMensajes(), Constantes.ERROR, "validacion11");
					modal.setVisible(true);
				} else {
					ModalGrafo modal = new ModalGrafo();
					modal.setVisible(true);
				}
			} else if (m.getName().equals("Arbol")) {
				ModalArbol modal = new ModalArbol();
				modal.setVisible(true);
			} else if (m.getName().equals("Completo") || m.getName().equals("Ciclo") || m.getName().equals("Rueda") || m.getName().equals("Estrella")) {
				ModalParticular modal = new ModalParticular(m.getName());
				modal.setVisible(true);
			}
		} else {
			ModalAceptar modal = new ModalAceptar(panelEdicion.getMensajes(), Constantes.ERROR, "AvisoLectura");
			modal.setVisible(true);
		}
	}


	private class ModalGrafo extends JDialog {

		private static final long serialVersionUID = 0xbac9b9da3e75d161L;
		private JTextField numeroVertices;
		private JTextField numeroAristas;
		private JTextField densidad;
		private JLabel info;
		private JLabel introVertices;
		private JLabel introAristas;
		private JLabel introDensidad;
		private JLabel validacion;
		private ButtonGroup grupoRadio;
		private JRadioButton activarAristas;
		private JRadioButton activarDensidad;
		private JButton botonAceptar;
		private JButton botonCancelar;
		private ResourceBundle mensajes;

		private ModalGrafo () {
			info = new JLabel();
			numeroVertices = new JTextField("");
			numeroAristas = new JTextField("");
			densidad = new JTextField("");
			introVertices = new JLabel();
			introAristas = new JLabel();
			introDensidad = new JLabel();
			validacion = new JLabel();
			grupoRadio = new ButtonGroup();

			activarAristas = new JRadioButton();
			activarDensidad = new JRadioButton();
			botonAceptar = new JButton();
			botonCancelar = new JButton();
			mensajes = panelEdicion.getMensajes();
			try {
				setTitle(new String(mensajes.getString("CrearAleatorio").getBytes("ISO-8859-1"),"UTF-8"));
				info.setText(new String(mensajes.getString("DatosAleatorio").getBytes("ISO-8859-1"),"UTF-8"));
				introVertices.setText(new String((mensajes.getString("NumVertices")+":").getBytes("ISO-8859-1"),"UTF-8"));
				introAristas.setText(new String((mensajes.getString("NumAris")+":").getBytes("ISO-8859-1"),"UTF-8"));
				introDensidad.setText(new String(mensajes.getString("Densidad").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"));
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}

			JPanel arriba = new JPanel();
			JPanel medio1 = new JPanel();
			JPanel medio2 = new JPanel();
			JPanel abajo = new JPanel();

			if(!mensajes.getLocale().getLanguage().equals("zh")) {
				info.setFont(Fuentes.Fuente2);
				introVertices.setFont(Fuentes.Fuente2);
				introAristas.setFont(Fuentes.Fuente2);
				introDensidad.setFont(Fuentes.Fuente2);
				validacion.setFont(Fuentes.Fuente4);
			} else {
				info.setFont(Fuentes.Fuente0);
				introVertices.setFont(Fuentes.Fuente0);
				introAristas.setFont(Fuentes.Fuente0);
				introDensidad.setFont(Fuentes.Fuente0);
				validacion.setFont(Fuentes.Fuente5);
			}

			arriba.setBounds(18, 10, 250, 25);
			arriba.add(info);
			getContentPane().add(arriba);

			grupoRadio.add(activarAristas);
			grupoRadio.add(activarDensidad);
			introVertices.setBounds(55, 30, 200, 20);
			numeroVertices.setBounds(250, 30, 40, 20);
			introAristas.setBounds(55, 60, 200, 20);
			numeroAristas.setBounds(250, 60, 40, 20);
			activarAristas.setBounds(350,60,20,20);
			activarAristas.setSelected(true);
			introDensidad.setBounds(55, 90, 200, 20);
			introDensidad.setEnabled(false);
			densidad.setBounds(250, 90, 40, 20);
			densidad.setEnabled(false);
			activarDensidad.setBounds(350,90,20,20);
			medio1.setBounds(17, 30, 380, 110);
			medio1.setLayout(null);
			medio1.add(introVertices);
			medio1.add(numeroVertices);
			medio1.add(introAristas);
			medio1.add(numeroAristas);
			medio1.add(activarAristas);
			medio1.add(introDensidad);
			medio1.add(densidad);
			medio1.add(activarDensidad);
			getContentPane().add(medio1);


			validacion.setForeground(new Color(255,0,0));
			validacion.setVisible(false);
			validacion.setBounds(0, 130, 400, 25);
			validacion.setHorizontalAlignment(SwingConstants.CENTER);
			medio2.setLayout(null);
			medio2.setBounds(0, 15, 400, 160);
			medio2.add(validacion);
			getContentPane().add(medio2);


			botonAceptar.setName("Aceptar");
			botonCancelar.setName("Cancelar");
			botonAceptar.setPreferredSize(new Dimension(85, 28));
			botonCancelar.setPreferredSize(new Dimension(85, 28));
			abajo.setBounds(0, 180, 400, 40);
			abajo.add(botonAceptar);
			abajo.add(botonCancelar);
			getContentPane().add(abajo);


			setSize(400, 260);
			setResizable(false);
			Toolkit kit = Toolkit.getDefaultToolkit();
			Dimension dim = kit.getScreenSize();
			setLocation(dim.width / 2 - getWidth() / 2, dim.height / 2 - getHeight() / 2);
			getContentPane().setLayout(null);
			getContentPane().setBackground(new Color(189,250,107));

			ActionListener acept = new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					Object obj = e.getSource();
					if (obj instanceof JButton) {
						if(((JButton)obj).getName().equals("Aceptar")) {
							aceptar();
						} else if(((JButton)obj).getName().equals("Cancelar")) {
							cancelar();
						}
					} else if (obj instanceof JTextField) {
						aceptar();
					} else if (obj instanceof JRadioButton) {
						cambiarSeleccion();
					}
				}
			};
			numeroVertices.addActionListener(acept);
			numeroAristas.addActionListener(acept);
			activarAristas.addActionListener(acept);
			densidad.addActionListener(acept);
			activarDensidad.addActionListener(acept);
			botonAceptar.addActionListener(acept);
			botonCancelar.addActionListener(acept);
		}

		public void aceptar() {
			if (activarAristas.isSelected()) {
				try {
					Integer v = new Integer(numeroVertices.getText());
					Integer a = new Integer(numeroAristas.getText());
					if(v.compareTo(0) > 0 && v.compareTo(100) <= 0) {
						if(a.compareTo(0) >= 0 && a.compareTo(Utilidades.calcularMaximoNumeroAristas(v)) <= 0) {
							Aleatorio g = new Aleatorio(v, a, null);
							panelInfo.mostrarNumeroVertices(g.getVertices().size());
							panelInfo.mostrarNumeroAristas(g.getAristas().size());
							panelEdicion.setGrafo(g);
							new SimplesAction(aplicacion).cambiarZoomBarra();
							Resultados.setMatriz((int[][])null);
							logger.info("Nuevo grafo creado");
							cancelar();
						} else {
							mostrarValidacion("validacion4");
						}
					} else {
						mostrarValidacion("validacion1");
					}
				} catch (Throwable exc) {
					mostrarValidacion("validacion2");
				}
			} else if (activarDensidad.isSelected()) {
				try {
					Integer v = new Integer(numeroVertices.getText());
					Integer d = new Integer(densidad.getText());
					if(v.compareTo(0) > 0 && v.compareTo(100) <= 0) {
						if(d.compareTo(0) >= 0 && d.compareTo(100) <= 0) {
							Aleatorio g = new Aleatorio(v, null, d);
							panelInfo.mostrarNumeroVertices(g.getVertices().size());
							panelInfo.mostrarNumeroAristas(g.getAristas().size());
							panelEdicion.setGrafo(g);
							new SimplesAction(aplicacion).cambiarZoomBarra();
							Resultados.setMatriz((int[][])null);
							logger.info("Nuevo grafo creado");
							cancelar();
						} else {
							mostrarValidacion("validacion5");
						}
					} else {
						mostrarValidacion("validacion1");
					}
				} catch (Throwable exc) {
					mostrarValidacion("validacion2");
				}
			}
		}

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

		public void cambiarSeleccion() {
			if (activarAristas.isSelected()) {
				introAristas.setEnabled(true);
				numeroAristas.setEnabled(true);
				introDensidad.setEnabled(false);
				densidad.setEnabled(false);
				densidad.setText("");
			} else {
				introAristas.setEnabled(false);
				numeroAristas.setEnabled(false);
				numeroAristas.setText("");
				introDensidad.setEnabled(true);
				densidad.setEnabled(true);
			}
		}

		public void mostrarValidacion(String texto) {
			validacion.setVisible(true);
			try {
				validacion.setText(new String(mensajes.getString(texto).getBytes("ISO-8859-1"),"UTF-8"));
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
		}
	}


	private class ModalArbol extends JDialog {

		private static final long serialVersionUID = 0xbac9b9da3e75d161L;
		private JTextField numeroVertices;
		private JTextField grado;
		private JLabel info;
		private JLabel introVertices;
		private JLabel introGrado;
//		private JLabel igualdad;
		private JLabel validacion;
//		private JCheckBox activarIgualdad;
		private JButton botonAceptar;
		private JButton botonCancelar;
		private ResourceBundle mensajes;

		private ModalArbol () {
			info = new JLabel();
			numeroVertices = new JTextField("");
			grado = new JTextField("");
			introVertices = new JLabel();
			introGrado = new JLabel();
//			igualdad = new JLabel();
			validacion = new JLabel();
//			activarIgualdad = new JCheckBox();
			botonAceptar = new JButton();
			botonCancelar = new JButton();
			mensajes = panelEdicion.getMensajes();
			try {
				setTitle(new String(mensajes.getString("crearArbol").getBytes("ISO-8859-1"),"UTF-8"));
				info.setText(new String(mensajes.getString("datosArbol").getBytes("ISO-8859-1"),"UTF-8"));
				introVertices.setText(new String((mensajes.getString("NumVertices")+":").getBytes("ISO-8859-1"),"UTF-8"));
				introGrado.setText(new String(mensajes.getString("grado").getBytes("ISO-8859-1"),"UTF-8"));
//				igualdad.setText(new String(mensajes.getString("igualdad").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"));
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}

			JPanel arriba = new JPanel();
			JPanel medio1 = new JPanel();
			JPanel medio2 = new JPanel();
			JPanel abajo = new JPanel();

			if(!mensajes.getLocale().getLanguage().equals("zh")) {
				info.setFont(Fuentes.Fuente2);
				introVertices.setFont(Fuentes.Fuente2);
				introGrado.setFont(Fuentes.Fuente2);
//				igualdad.setFont(Fuentes.Fuente2);
				validacion.setFont(Fuentes.Fuente4);
			} else {
				info.setFont(Fuentes.Fuente0);
				introVertices.setFont(Fuentes.Fuente0);
				introGrado.setFont(Fuentes.Fuente0);
//				igualdad.setFont(Fuentes.Fuente0);
				validacion.setFont(Fuentes.Fuente5);
			}

			arriba.setBounds(18, 10, 250, 25);
			arriba.add(info);
			getContentPane().add(arriba);

			introVertices.setBounds(40, 30, 200, 20);
			numeroVertices.setBounds(280, 30, 40, 20);
			introGrado.setBounds(40, 60, 200, 20);
			grado.setBounds(280, 60, 40, 20);
//			igualdad.setBounds(40, 90, 220, 20);
//			activarIgualdad.setBounds(300,90,20,20);
			medio1.setBounds(17, 30, 380, 110);
			medio1.setLayout(null);
			medio1.add(introVertices);
			medio1.add(numeroVertices);
			medio1.add(introGrado);
			medio1.add(grado);
//			medio1.add(igualdad);
//			medio1.add(activarIgualdad);
			getContentPane().add(medio1);


			validacion.setForeground(new Color(255,0,0));
			validacion.setVisible(false);
			validacion.setBounds(0, 130, 400, 25);
			validacion.setHorizontalAlignment(SwingConstants.CENTER);
			medio2.setLayout(null);
			medio2.setBounds(0, 15, 400, 160);
			medio2.add(validacion);
			getContentPane().add(medio2);


			botonAceptar.setName("Aceptar");
			botonCancelar.setName("Cancelar");
			botonAceptar.setPreferredSize(new Dimension(85, 28));
			botonCancelar.setPreferredSize(new Dimension(85, 28));
			abajo.setBounds(0, 180, 400, 40);
			abajo.add(botonAceptar);
			abajo.add(botonCancelar);
			getContentPane().add(abajo);


			setSize(400, 260);
			setResizable(false);
			Toolkit kit = Toolkit.getDefaultToolkit();
			Dimension dim = kit.getScreenSize();
			setLocation(dim.width / 2 - getWidth() / 2, dim.height / 2 - getHeight() / 2);
			getContentPane().setLayout(null);
			getContentPane().setBackground(new Color(189,250,107));

			ActionListener acept = new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					Object obj = e.getSource();
					if (obj instanceof JButton) {
						if(((JButton)obj).getName().equals("Aceptar")) {
							aceptar();
						} else if(((JButton)obj).getName().equals("Cancelar")) {
							cancelar();
						}
					} else if (obj instanceof JTextField) {
						aceptar();
					}
				}
			};
			numeroVertices.addActionListener(acept);
			grado.addActionListener(acept);
			botonAceptar.addActionListener(acept);
			botonCancelar.addActionListener(acept);
		}

		public void aceptar() {
			try {
				Integer v = new Integer(numeroVertices.getText());
				Integer gr = new Integer(grado.getText());
				if(v.compareTo(0) > 0 && v.compareTo(100) <= 0) {
					//if(gr.compareTo(0) >= 0 && gr.compareTo(Utilidades.calcularMaximoNumeroAristas(v)) <= 0) {
					Arbol g = new Arbol(v, gr, panelEdicion.getSize());
					panelInfo.mostrarNumeroVertices(g.getVertices().size());
					panelInfo.mostrarNumeroAristas(g.getAristas().size());
					panelEdicion.setGrafo(g);
					new SimplesAction(aplicacion).cambiarZoomBarra();
					Resultados.setMatriz((int[][])null);
					logger.info("Nuevo árbol creado");
					cancelar();
					/*} else {
						mostrarValidacion("validacion4");
					}*/
				} else {
					mostrarValidacion("validacion1");
				}
			} catch (Throwable exc) {
				mostrarValidacion("validacion2");
			}
		}

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

		public void mostrarValidacion(String texto) {
			validacion.setVisible(true);
			try {
				validacion.setText(new String(mensajes.getString(texto).getBytes("ISO-8859-1"),"UTF-8"));
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
		}
	}


	private class ModalParticular extends JDialog {

		private static final long serialVersionUID = 0x95f22298e85bf6b1L;
		private JLabel info;
		private JTextField n;
		private JLabel validacion;
		private JButton botonAceptar;
		private JButton botonCancelar;
		private String tipo;
		private ResourceBundle mensajes;

		private ModalParticular(String t) {
			info = new JLabel();
			n = new JTextField("");
			validacion = new JLabel();
			botonAceptar = new JButton();
			botonCancelar = new JButton();
			tipo = t;
			mensajes = panelEdicion.getMensajes();
			try {
				if (tipo.equals("Completo"))
					setTitle(new String(mensajes.getString("CrearGComp").getBytes("ISO-8859-1"),"UTF-8"));
				else if (tipo.equals("Ciclo"))
					setTitle(new String(mensajes.getString("CrearGCic").getBytes("ISO-8859-1"),"UTF-8"));
				else if (tipo.equals("Rueda"))
					setTitle(new String(mensajes.getString("CrearRueda").getBytes("ISO-8859-1"),"UTF-8"));
				else if (tipo.equals("Estrella"))
					setTitle(new String(mensajes.getString("CrearEstrella").getBytes("ISO-8859-1"),"UTF-8"));
				info.setText(new String(mensajes.getString("introduzcaVertices").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"));
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}

			JPanel arriba = new JPanel();
			JPanel medio1 = new JPanel();
			JPanel medio2 = new JPanel();
			JPanel abajo = new JPanel();

			if(!mensajes.getLocale().getLanguage().equals("zh")) {
				info.setFont(Fuentes.Fuente2);
				validacion.setFont(Fuentes.Fuente4);
			} else {
				info.setFont(Fuentes.Fuente0);
				validacion.setFont(Fuentes.Fuente5);
			}

			arriba.setBounds(18, 10, 230, 25);
			arriba.add(info);
			getContentPane().add(arriba);


			n.setBounds(90, 30, 40, 20);
			medio1.setBounds(85, 30, 380, 50);
			medio1.setLayout(null);
			medio1.add(n);
			getContentPane().add(medio1);


			validacion.setForeground(new Color(255,0,0));
			validacion.setVisible(false);
			validacion.setBounds(0, 70, 400, 25);
			validacion.setHorizontalAlignment(SwingConstants.CENTER);
			medio2.setLayout(null);
			medio2.setBounds(0, 15, 400, 100);
			medio2.add(validacion);
			getContentPane().add(medio2);


			botonAceptar.setName("Aceptar");
			botonCancelar.setName("Cancelar");
			botonAceptar.setPreferredSize(new Dimension(85, 28));
			botonCancelar.setPreferredSize(new Dimension(85, 28));
			abajo.setBounds(0, 120, 400, 40);
			abajo.add(botonAceptar);
			abajo.add(botonCancelar);
			getContentPane().add(abajo);


			setSize(400, 200);
			setResizable(false);
			Toolkit kit = Toolkit.getDefaultToolkit();
			Dimension dim = kit.getScreenSize();
			setLocation(dim.width / 2 - getWidth() / 2, dim.height / 2 - getHeight() / 2);
			getContentPane().setLayout(null);
			getContentPane().setBackground(new Color(189,250,107));

			ActionListener acept = new ActionListener() {

				public void actionPerformed(ActionEvent e) {
					Object obj = e.getSource();
					if (obj instanceof JButton) {
						if(((JButton)obj).getName().equals("Aceptar")) {
							aceptar();
						} else if(((JButton)obj).getName().equals("Cancelar")) {
							cancelar();
						}
					} else if (obj instanceof JTextField) {
						aceptar();
					}
				}
			};
			n.addActionListener(acept);
			botonAceptar.addActionListener(acept);
			botonCancelar.addActionListener(acept);
		}

		public void aceptar() {
			try {
				Integer v = new Integer(n.getText());
				if(v.compareTo(0) > 0 && v.compareTo(100) <= 0) {
					if(tipo.equals("Completo")) {
						Completo g = new Completo(v);
						panelInfo.mostrarNumeroVertices(g.getVertices().size());
						panelInfo.mostrarNumeroAristas(g.getAristas().size());
						panelEdicion.setGrafo(g);
						logger.info("Nuevo grafo completo creado");
					} else if(tipo.equals("Ciclo")) {
						Ciclo g = new Ciclo(v);
						panelInfo.mostrarNumeroVertices(g.getVertices().size());
						panelInfo.mostrarNumeroAristas(g.getAristas().size());
						panelEdicion.setGrafo(g);
						logger.info("Nuevo grafo ciclo creado");
					} else if(tipo.equals("Rueda")) {
						Rueda g = new Rueda(v);
						panelInfo.mostrarNumeroVertices(g.getVertices().size());
						panelInfo.mostrarNumeroAristas(g.getAristas().size());
						panelEdicion.setGrafo(g);
						logger.info("Nuevo grafo rueda creado");
					} else if(tipo.equals("Estrella")) {
						Estrella g = new Estrella(v);
						panelInfo.mostrarNumeroVertices(g.getVertices().size());
						panelInfo.mostrarNumeroAristas(g.getAristas().size());
						panelEdicion.setGrafo(g);
						logger.info("Nuevo árbol estrella creado");
					}
					new SimplesAction(aplicacion).cambiarZoomBarra();
					Resultados.setMatriz((int[][])null);
					cancelar();
				} else {
					mostrarValidacion("validacion1");
				}
			} catch (Throwable exc) {
				String mensaje;
				if(Configuracion.isModoArbol()) {
					mensaje = "validacion11";
				} else {
					mensaje = "validacion2";
				}
				mostrarValidacion(mensaje);
			}
		}

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

		public void mostrarValidacion(String texto) {
			validacion.setVisible(true);
			try {
				validacion.setText(new String(mensajes.getString(texto).getBytes("ISO-8859-1"),"UTF-8"));
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
		}
	}
}