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.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

import org.apache.log4j.Logger;

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

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

    private PanelEdicion panelEdicion;
    private ResourceBundle mensajes;

    public GemelosAction (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 if (Utilidades.esVaciaONula(panelEdicion.getGrafo().getVerticesSeleccionados())) {
        	new ModalGemelos();
        } else if (panelEdicion.getGrafo().getVerticesSeleccionados().size() == 1){
        	int numeroVertices = panelEdicion.getGrafo().getVertices().size();
			Vertice v = panelEdicion.getGrafo().getVerticesSeleccionados().get(0);
        	for (int i=0; i<numeroVertices; i++) {
				Vertice v2 = panelEdicion.getGrafo().getVertices().get(i);
				if (v.getId() != v2.getId()) {
					if (Utilidades.sonGemelos(v, v2).equals("GEMELOSAD")) {
						panelEdicion.getGrafo().getVertices().get(i).setSolucion(true);
    				} else if (Utilidades.sonGemelos(v, v2).equals("GEMELOSNO")) {
    					panelEdicion.getGrafo().getVertices().get(i).setSolucion(true);
    				}
				}
			}
        	panelEdicion.repaint();
        	logger.info("Gemelos mostrados");
        } else {
        	ModalAceptar modal = new ModalAceptar(panelEdicion.getMensajes(), Constantes.ADVERTENCIA, "seleccioneUnVertices");
        	modal.setVisible(true);
        }
    }
    
    private class ModalGemelos extends JDialog {

    	private static final long serialVersionUID = 8657303067820054416L;
    	private JLabel tablero[][];

    	private ModalGemelos() {
    		int numeroVertices = panelEdicion.getGrafo().getVertices().size();
    		tablero = new JLabel[numeroVertices][2];
    		JPanel panelConDistancias = new JPanel(new GridLayout(numeroVertices, numeroVertices));
    		getContentPane().setBackground(new Color(189,250,107));
    		panelConDistancias.setBackground(new Color(217,233,251));
    		JButton botonAceptar = new JButton();
    		JPanel panelGemelos = new JPanel();
    		JScrollPane panelScrollGemelos = new JScrollPane();
    		JLayeredPane panelContenedor = new JLayeredPane();
    		panelScrollGemelos.setBackground(new Color(189,250,107));
    		JLabel etiqueta[] = new JLabel[numeroVertices];
    		JLabel etiqueta2[] = new JLabel[2];
    		getContentPane().setLayout(null);
    		panelGemelos.setBounds(0,0,692,420);
    		panelGemelos.setLayout(null);
    		panelGemelos.add(panelScrollGemelos);
    		getContentPane().add(panelGemelos);
    		panelScrollGemelos.setBounds(0,0,692,420);
    		Vertice v = null;
    		panelContenedor.setPreferredSize(new Dimension(500, numeroVertices * 20 + 40));
    		GridLayout g = new GridLayout(0, 2);
    		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, 500, 25);
    		panelF.setOpaque(false);
    		panelC.setBounds(5, 33, 25, numeroVertices * 20);
    		panelC.setOpaque(false);
    		panelConDistancias.setBounds(25, 25, 500, numeroVertices * 20 + 10);
    		panelConDistancias.setBorder(BorderFactory.createMatteBorder(5, 5, 5, 5, new Color(189,250,107)));
    		panelConDistancias.setOpaque(false);
    		etiqueta2[0] = new JLabel();
    		etiqueta2[1] = new JLabel();
    		for(int i = 0; i < 2; i++) {
				etiqueta2[i].setFont(Fuentes.Fuente3);
				etiqueta2[i].setForeground(new Color(168, 60, 146));
				etiqueta2[i].setPreferredSize(new Dimension(250, 25));
				etiqueta2[i].setVerticalAlignment(0);
				etiqueta2[i].setHorizontalAlignment(0);
				panelF.add(etiqueta2[i]);
    		}			
    		for(int n = 0; n < numeroVertices; n++) {
    			v = panelEdicion.getGrafo().getVertices().get(n);
    			etiqueta[n] = new JLabel((new StringBuilder()).append(v.getId()).toString());
    			etiqueta[n].setFont(Fuentes.Fuente3);
    			etiqueta[n].setForeground(new Color(168, 60, 146));
    			etiqueta[n].setPreferredSize(new Dimension(25, 25));
    			etiqueta[n].setVerticalAlignment(0);
    			etiqueta[n].setHorizontalAlignment(0);
    			panelC.add(etiqueta[n]);
    			
    			String gemelosNo = "";
    			String gemelosSi = "";
    			for (int i=0; i<numeroVertices; i++) {
    				Vertice v2 = panelEdicion.getGrafo().getVertices().get(i);
    				if (v.getId() != v2.getId()) {
    					if (Utilidades.sonGemelos(v, v2).equals("GEMELOSAD")) {
        					gemelosSi += i+1 + ",";
        				} else if (Utilidades.sonGemelos(v, v2).equals("GEMELOSNO")) {
        					gemelosNo += i+1 + ",";
        				}
    				}
    			}
    			if (gemelosSi != "")
    				gemelosSi = gemelosSi.substring(0, gemelosSi.length()-1);
    			if (gemelosNo != "")
    				gemelosNo = gemelosNo.substring(0, gemelosNo.length()-1);
    			for(int c = 0; c < 2; c++) {
    				tablero[n][c] = new JLabel();
    				tablero[n][c].setPreferredSize(new Dimension(20, 20));
    				tablero[n][c].setVerticalAlignment(0);
    				tablero[n][c].setHorizontalAlignment(0);
    				tablero[n][c].setBorder(BorderFactory.createLineBorder(Color.BLACK));
    				panelConDistancias.add(tablero[n][c]);
    			}
    			tablero[n][0].setText(gemelosSi);
    			tablero[n][1].setText(gemelosNo);
    		}
    		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(500, numeroVertices * 20 + 40));
    		panelContenedor2.add(panelContenedor);
    		if(numeroVertices < 18) {
    			panelContenedor.setBounds(320 - panelConDistancias.getSize().width / 2, 195 - panelConDistancias.getSize().height / 2, 520, numeroVertices * 20 + 40);
    		} else {
    			panelContenedor.setBounds(320 - panelConDistancias.getSize().width / 2, 0, 520, numeroVertices * 20 + 40);
    		}
    		panelScrollGemelos.setViewportView(panelContenedor2);

    		botonAceptar.setName("Aceptar");
    		try {
    			etiqueta2[0].setText(new String(mensajes.getString("GemelosAdy").getBytes("ISO-8859-1"),"UTF-8"));
        		etiqueta2[1].setText(new String(mensajes.getString("GemelosNoAdy").getBytes("ISO-8859-1"),"UTF-8"));
    			setTitle(new String(mensajes.getString("TitGemelos").getBytes("ISO-8859-1"),"UTF-8"));
    			botonAceptar.setText(new String(mensajes.getString("Aceptar").getBytes("ISO-8859-1"),"UTF-8"));
    		} catch (UnsupportedEncodingException e) {
    			e.printStackTrace();
    		}
    		abajo.setBounds(310, 430, 80, 40);
    		abajo.add(botonAceptar);
    		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();
    				}
    			}
    		}

    		Aceptar lAceptar = new Aceptar();
    		botonAceptar.addActionListener(lAceptar);
    		setModal(true);
    		setVisible(true);
    	}

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