package actions;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.ResourceBundle;
import java.util.Set;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;

import org.apache.log4j.Logger;

import utils.Constantes;
import utils.Fuentes;
import utils.Utilidades;
import business.Arista;
import business.Configuracion;
import business.Grafo;
import business.Resultados;
import business.Vertice;
import core.ModalConfirmacion;
import core.PanelEdicion;
import core.PanelInfo;

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

	private static PanelEdicion panelEdicion;
	private static PanelInfo panelInfo;
	private static Vertice verticePulsado;

	public ContextualAction (PanelEdicion pEdicion, PanelInfo pInfo) {
		panelEdicion = pEdicion;
		panelInfo = pInfo;
	}

	public void actionPerformed(ActionEvent e) {
		if(!Utilidades.esVaciaONula(panelEdicion.getGrafo().getVerticesSeleccionados()) || !Utilidades.esVaciaONula(panelEdicion.getGrafo().getAristasSeleccionadas())) {

			JMenuItem m = new JMenuItem();
			if(e.getSource() instanceof JMenuItem) {
				m = (JMenuItem)e.getSource();
			} else
				m.setName("");

			if(m.getName().equals("Borrar")) {
				if(Configuracion.isPanelesConfirmacion()) {
					ModalConfirmacion modal = new ModalConfirmacion(panelEdicion.getMensajes(), Constantes.PREGUNTA, "ConfirmacionBorrarElementos", getClass().getSimpleName());
					modal.setVisible(true);
				} else {
					borrar();
				}
			} else if (m.getName().equals("Mover")) {
				ModalMover modal = new ModalMover();
				modal.setVisible(true);
			}
		}
	}

	public static void borrar() {
		Resultados.setMatriz((int[][])null);
		Grafo grafo = panelEdicion.getGrafo();
		grafo.borrarAristas(panelEdicion.getGrafo().getAristasSeleccionadas());
		grafo.borrarVertices(panelEdicion.getGrafo().getVerticesSeleccionados());
		grafo.setAristasSeleccionadas(new HashSet<Arista>());
		grafo.setVerticesSeleccionados(new ArrayList<Vertice>());
		panelEdicion.repaint();
		panelInfo.mostrarNumeroAristas(grafo.getAristas().size());
		panelInfo.mostrarNumeroAristasSeleccionadas(0);
		panelInfo.mostrarNumeroVertices(grafo.getVertices().size());
		panelInfo.mostrarNumeroVerticesSeleccionados(0);
		panelInfo.repaint();
	}

	public static void setVerticePulsado(Vertice verticePulsado) {
		ContextualAction.verticePulsado = verticePulsado;
	}

	private class ModalMover extends JDialog {

		private static final long serialVersionUID = 0xbac9b9da3e75d161L;
		private JTextField x;
		private JTextField y;
		private JLabel info;
		private JLabel introX;
		private JLabel introY;
		private JLabel validacion;
		private JButton botonAceptar;
		private JButton botonCancelar;
		private ResourceBundle mensajes;

		private ModalMover() {
			info = new JLabel();
			x = new JTextField("");
			y = new JTextField("");
			introX = new JLabel();
			introY = new JLabel();
			validacion = new JLabel();
			botonAceptar = new JButton();
			botonCancelar = new JButton();
			mensajes = panelEdicion.getMensajes();
			try {
				setTitle(new String(mensajes.getString("EditNodo").getBytes("ISO-8859-1"),"UTF-8"));
				info.setText(new String(mensajes.getString("SelCoor").getBytes("ISO-8859-1"),"UTF-8"));
				introX.setText(new String(mensajes.getString("CoorX").getBytes("ISO-8859-1"),"UTF-8"));
				introY.setText(new String(mensajes.getString("CoorY").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);
				introX.setFont(Fuentes.Fuente2);
				introY.setFont(Fuentes.Fuente2);
				validacion.setFont(Fuentes.Fuente4);
			} else {
				info.setFont(Fuentes.Fuente0);
				introX.setFont(Fuentes.Fuente0);
				introY.setFont(Fuentes.Fuente0);
				validacion.setFont(Fuentes.Fuente5);
			}

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


			introX.setBounds(55, 30, 30, 20);
			x.setBounds(90, 30, 40, 20);
			introY.setBounds(195, 30, 30, 20);
			y.setBounds(230, 30, 40, 20);
			medio1.setBounds(17, 30, 380, 50);
			medio1.setLayout(null);
			medio1.add(introX);
			medio1.add(x);
			medio1.add(introY);
			medio1.add(y);
			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();
					}
				}
			};
			x.addActionListener(acept);
			y.addActionListener(acept);
			botonAceptar.addActionListener(acept);
			botonCancelar.addActionListener(acept);
		}

		public void aceptar() {
			try {
				Integer px = new Integer(x.getText());
				Integer py = new Integer(y.getText());
				if(px.compareTo(0) >= 0 && py.compareTo(0) >= 0 && px.compareTo(Constantes.PANEL_ANCHO) <= 0 && py.compareTo(Constantes.PANEL_ALTO) <= 0) {
					if(mover(px,py)) {
						cancelar();
					} else {
						mostrarValidacion("validacion6");
					}
				} else {
					mostrarValidacion("validacion3");
				}
			} catch (Throwable exc) {
				mostrarValidacion("validacion2");
			}
		}

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

		public boolean mover(Integer px, Integer py) {
			ArrayList<Vertice> verticesSeleccionados = panelEdicion.getGrafo().getVerticesSeleccionados();
			HashMap<Integer,Point> verticesCambiados = new HashMap<Integer, Point>();
			for(Vertice v : verticesSeleccionados) {
				if(!v.getId().equals(verticePulsado.getId())) {
					Integer XNuevo = px + v.getPunto().x - verticePulsado.getPunto().x;
					Integer YNuevo = py + v.getPunto().y - verticePulsado.getPunto().y;
					if(XNuevo < 0 || XNuevo > Constantes.PANEL_ANCHO || YNuevo < 0 || YNuevo > Constantes.PANEL_ALTO) {
						Set<Integer> claves = verticesCambiados.keySet();
						for(Integer i : claves) {
							for(Vertice j : verticesSeleccionados) {
								if(j.getId().equals(i)) {
									j.setPunto(verticesCambiados.get(i));
								}
							}
						}
						return false;
					}
					verticesCambiados.put(v.getId(), v.getPunto());
					v.setPunto(new Point(XNuevo, YNuevo));
				}
			}
			verticePulsado.setPunto(new Point(px,py));
			logger.info("Los vértices seleccionados han sido movidos");
			return 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();
			}
		}
	}
}