package actions;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
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.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;

import org.apache.log4j.Logger;

import utils.Constantes;
import utils.Fuentes;
import utils.RutasIconos;
import utils.Utilidades;
import business.Resultados;
import business.Vertice;
import core.ModalAceptar;
import core.PanelEdicion;

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

    private PanelEdicion panelEdicion;
    private ResourceBundle mensajes;

    public MatrizAction (PanelEdicion pEdicion) {
        panelEdicion = pEdicion;
        mensajes = pEdicion.getMensajes();
    }

    public void actionPerformed(ActionEvent e) {
        if(panelEdicion.getGrafo().getVertices().size() == 0) {
        	ModalAceptar modal = new ModalAceptar(panelEdicion.getMensajes(), Constantes.INFORMACION, "NoExisteGrafo");
        	modal.setVisible(true);
        } else {
        	ModalMatriz modal = new ModalMatriz();
        	modal.setVisible(true);
        }
    }
    
    private class ModalMatriz extends JDialog {

    	private static final long serialVersionUID = 8657303067820054416L;
    	private JLabel tablero[][];
    	private boolean cambiarAAdyacencias;
    	private int matrizMedidas[][];

    	private ModalMatriz() {
    		cambiarAAdyacencias = true;
    		int numeroVertices = panelEdicion.getGrafo().getVertices().size();
    		tablero = new JLabel[numeroVertices][numeroVertices];
    		matrizMedidas = new int[numeroVertices][numeroVertices];
    		JPanel panelConDistancias = new JPanel(new GridLayout(numeroVertices, numeroVertices));
    		panelConDistancias.setBackground(new Color(217,233,251));
    		JScrollPane panelScrollMatriz = new JScrollPane();
    		panelScrollMatriz.setBackground(new Color(189,250,107));
    		getContentPane().setBackground(new Color(189,250,107));
    		JButton botonAceptar = new JButton();
    		JButton botonCambiar = new JButton();
    		JPanel panelMatrizDist = new JPanel();
    		JLayeredPane panelContenedor = new JLayeredPane();
    		panelConDistancias.setBounds(25, 25, numeroVertices * 20 + 10, numeroVertices * 20 + 10);
    		panelConDistancias.setBorder(BorderFactory.createMatteBorder(5, 5, 5, 5, new Color(189,250,107)));
    		panelConDistancias.setOpaque(false);
    		JLabel etiqueta[] = new JLabel[numeroVertices];
    		JLabel etiqueta2[] = new JLabel[numeroVertices];
    		getContentPane().setLayout(null);
    		panelMatrizDist.setBounds(0,0,692,420);
    		panelMatrizDist.setLayout(null);
    		panelMatrizDist.add(panelScrollMatriz);
    		getContentPane().add(panelMatrizDist);
    		panelScrollMatriz.setBounds(0,0,692,420);
    		Vertice v = null;
    		panelContenedor.setPreferredSize(new Dimension(numeroVertices * 20 + 40, numeroVertices * 20 + 40));
    		GridLayout g = new GridLayout(0, numeroVertices);
    		g.setHgap(2);
    		GridLayout g2 = new GridLayout(numeroVertices, 0);
    		g2.setVgap(7);
    		JPanel abajo = new JPanel();
    		JPanel panelF = new JPanel(g);
    		JPanel panelC = new JPanel(g2);
    		abajo.setBackground(new Color(189,250,107));
    		panelF.setBackground(new Color(189,250,107));
    		panelC.setBackground(new Color(189,250,107));
    		panelF.setBounds(32, 5, numeroVertices * 20, 25);
    		panelF.setOpaque(false);
    		panelC.setBounds(5, 33, 25, numeroVertices * 20);
    		panelC.setOpaque(false);
    		if(Resultados.getMatriz() == null) {
    			matrizMedidas = new int[numeroVertices][numeroVertices];
    			Utilidades.CalcularMatriz(matrizMedidas, panelEdicion.getGrafo());
    			Resultados.setMatriz(matrizMedidas);
    		} else {
    			matrizMedidas = Resultados.getMatriz();
    		}
    		for(int f = 0; f < numeroVertices; f++) {
    			v = panelEdicion.getGrafo().getVertices().get(f);
    			etiqueta[f] = new JLabel((new StringBuilder()).append(v.getId()).toString());
    			etiqueta[f].setFont(Fuentes.Fuente3);
    			etiqueta[f].setForeground(new Color(168, 60, 146));
    			etiqueta[f].setPreferredSize(new Dimension(25, 25));
    			etiqueta[f].setVerticalAlignment(0);
    			etiqueta[f].setHorizontalAlignment(0);
    			panelC.add(etiqueta[f]);
    			etiqueta2[f] = new JLabel((new StringBuilder()).append(v.getId()).toString());
    			etiqueta2[f].setFont(Fuentes.Fuente3);
    			etiqueta2[f].setForeground(new Color(168, 60, 146));
    			etiqueta2[f].setPreferredSize(new Dimension(25, 25));
    			etiqueta2[f].setVerticalAlignment(0);
    			etiqueta2[f].setHorizontalAlignment(0);
    			panelF.add(etiqueta2[f]);
    			int nf = v.getId();
    			for(int c = 0; c < numeroVertices; c++) {
    				v = panelEdicion.getGrafo().getVertices().get(c);
    				int nc = v.getId();
    				if((matrizMedidas[f][c] == 0 || matrizMedidas[f][c] == -1) && f != c) {
    					matrizMedidas[f][c] = -1;
    					tablero[f][c] = new JLabel((new StringBuilder()).append("\u221E").toString());
    				} else {
    					tablero[f][c] = new JLabel((new StringBuilder()).append(matrizMedidas[f][c]).toString());
    				}
    				tablero[f][c].setPreferredSize(new Dimension(20, 20));
    				tablero[f][c].setVerticalAlignment(0);
    				tablero[f][c].setHorizontalAlignment(0);
    				tablero[f][c].setBorder(BorderFactory.createLineBorder(Color.BLACK));
    				try {
    					tablero[f][c].setToolTipText("(" + nf + " " + (new String(mensajes.getString("a").getBytes("ISO-8859-1"),"UTF-8")) + " " + nc + ")");
    				} catch (UnsupportedEncodingException e) {
    					e.printStackTrace();
    				}
    				panelConDistancias.add(tablero[f][c]);
    			}
    		}
    		logger.info("Matriz de distancias mostrada");
    		panelContenedor.add(panelF);
    		panelF.setFocusable(false);
    		panelContenedor.add(panelC);
    		panelContenedor.add(panelConDistancias, 0);
    		panelConDistancias.setFocusable(false);
    		JPanel panelContenedor2 = new JPanel();
    		panelContenedor2.setBackground(new Color(189,250,107));
    		panelContenedor2.setLayout(null);
    		panelContenedor2.setPreferredSize(new Dimension(numeroVertices * 20 + 40, numeroVertices * 20 + 40));
    		panelContenedor2.add(panelContenedor);
    		if(numeroVertices < 18) {
    			panelContenedor.setBounds(320 - panelConDistancias.getSize().width / 2, 195 - panelConDistancias.getSize().height / 2, numeroVertices * 20 + 40, numeroVertices * 20 + 40);
    		} else if (numeroVertices < 32) {
    			panelContenedor.setBounds(320 - panelConDistancias.getSize().width / 2, 0, numeroVertices * 20 + 40, numeroVertices * 20 + 40);
    		} else {
    			panelContenedor.setBounds(0, 0, numeroVertices * 20 + 40, numeroVertices * 20 + 40);
    		}
    		panelScrollMatriz.setViewportView(panelContenedor2);

    		JSeparator separador = new JSeparator();
    		separador.setPreferredSize(new Dimension(200,0));
    		botonAceptar.setName("Aceptar");
    		botonCambiar.setIcon(new ImageIcon(getClass().getClassLoader().getResource(RutasIconos.CambioMatriz)));
    		botonCambiar.setName("Cambiar");
    		try {
    			setTitle(new String(mensajes.getString("MatrizDist").getBytes("ISO-8859-1"),"UTF-8"));
    			botonAceptar.setText(new String(mensajes.getString("Aceptar").getBytes("ISO-8859-1"),"UTF-8"));
    			botonCambiar.setToolTipText(new String(mensajes.getString("cambiarMatriz").getBytes("ISO-8859-1"),"UTF-8"));
    		} catch (UnsupportedEncodingException e) {
    			e.printStackTrace();
    		}
    		abajo.setBounds(280, 430, 400, 40);
    		abajo.add(botonAceptar);
    		abajo.add(separador);
    		abajo.add(botonCambiar);
    		getContentPane().add(abajo);

    		setSize(700,500);
    		setResizable(false);
    		Toolkit kit = Toolkit.getDefaultToolkit();
    		Dimension pantallaTam = kit.getScreenSize();
    		setLocation(pantallaTam.width / 2 - getWidth() / 2, pantallaTam.height / 2 - getHeight() / 2);

    		class Aceptar implements ActionListener {

    			public void actionPerformed(ActionEvent e) {
    				Object obj = e.getSource();
    				if(((JButton)obj).getName().equals("Aceptar")) {
    					aceptar();
    				} else {
    					cambiar();
    				}
    			}
    		}

    		Aceptar lAceptar = new Aceptar();
    		botonAceptar.addActionListener(lAceptar);
    		botonCambiar.addActionListener(lAceptar);
    	}

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

    	public void cambiar() {
    		int numeroVertices = panelEdicion.getGrafo().getVertices().size();
    		if(cambiarAAdyacencias) {
    			try {
    				setTitle(new String(mensajes.getString("matrizAdyacencias").getBytes("ISO-8859-1"),"UTF-8"));
    			} catch (UnsupportedEncodingException e) {
    				e.printStackTrace();
    			}
    			for(int f = 0; f < numeroVertices; f++) {
    				for(int c = 0; c < numeroVertices; c++) {
    					if(tablero[f][c].getText().equals("1")) {
    						tablero[f][c].setText("X");
    						tablero[f][c].setForeground(Color.RED);
    					} else {
    						tablero[f][c].setText("");
    					}
    				}
    			}
    			logger.info("Cambio a matriz de adyacencias");
    		} else {
    			try {
    				setTitle(new String(mensajes.getString("MatrizDist").getBytes("ISO-8859-1"),"UTF-8"));
    			} catch (UnsupportedEncodingException e) {
    				e.printStackTrace();
    			}
    			for(int f = 0; f < numeroVertices; f++) {
    				for(int c = 0; c < numeroVertices; c++) {
    					if (matrizMedidas[f][c] == -1) {
    						tablero[f][c].setText((new StringBuilder()).append("\u221E").toString());
    					} else {
    						tablero[f][c].setText((new StringBuilder()).append(matrizMedidas[f][c]).toString());
    					}
    					tablero[f][c].setForeground(Color.BLACK);
    				}
    			}
    			logger.info("Cambio a matriz de distancias");
    		}
    		cambiarAAdyacencias = !cambiarAAdyacencias;
    	}
    }
}