package actions;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
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.ResourceBundle;
import java.util.Vector;

import javax.swing.BorderFactory;
import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListModel;
import javax.swing.ScrollPaneConstants;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

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 DetalleAction implements ActionListener {
	
	private static Logger logger = Logger.getLogger(DetalleAction.class);

	private PanelEdicion panelEdicion;
	private ArrayList<Integer> conjuntoSeleccionado;

	public DetalleAction(PanelEdicion pEdicion) {
		panelEdicion = pEdicion;
		conjuntoSeleccionado = new ArrayList<Integer>();
	}

	public void actionPerformed(ActionEvent e) {
		if(!Utilidades.esVaciaONula(Resultados.getResultados())) {
			ModalDetalle modal = new ModalDetalle();
			modal.setVisible(true);
		} else {
			ModalAceptar modal = new ModalAceptar(panelEdicion.getMensajes(), Constantes.INFORMACION, "NoHayResultados");
			modal.setVisible(true);
		}
	}

	private class ModalDetalle extends JDialog {

		private static final long serialVersionUID = 0x5ca08341bd8568a6L;
		private ResourceBundle mensajes;
		private JPanel panelDetalle;
		private JPanel panelConjuntos;
		private JPanel panelFlechas;
		private JPanel panelDistancias;
		private JScrollPane scrollConjuntos;
		private JButton flecha1 = new JButton();
		private JButton flecha2 = new JButton();
		private JTextField numero = new JTextField();
		private JButton flecha3 = new JButton();
		private JButton flecha4 = new JButton();
		private JScrollPane scrollDistancias;
		private JList listaConjuntos;
		private Vector<ArrayList<Integer>> pagina;
		private ListModel modeloConjuntos;
		private JTable tablaDistancias;
		private JButton botonAceptar;
//		private JButton botonExportar;


		private ModalDetalle() {
			conjuntoSeleccionado = new ArrayList<Integer>();
			mensajes = panelEdicion.getMensajes();
			construirPanel();
		}


		private void construirPanel() {
			panelDetalle = new JPanel();
			panelConjuntos = new JPanel();
			panelFlechas = new JPanel();
			panelDistancias = new JPanel();
			listaConjuntos = new JList();
			scrollConjuntos = new JScrollPane(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
			scrollDistancias = new JScrollPane(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
			modeloConjuntos = new DefaultComboBoxModel(new String[] {""});
			botonAceptar = new JButton();
//			botonExportar = new JButton();


			listaConjuntos.setModel(modeloConjuntos);
			listaConjuntos.setSelectionMode(0);
			listaConjuntos.setBackground(new Color(230,250,185));
			irAInicio();
			scrollConjuntos.setBounds(21, 30, 200, 180);
			scrollConjuntos.getHorizontalScrollBar().setPreferredSize(new Dimension(0, 15));
			scrollConjuntos.setViewportView(listaConjuntos);
			panelConjuntos.setBounds(10, 10, 250, 230);
			panelConjuntos.setLayout(null);
			panelConjuntos.add(scrollConjuntos);
			panelDetalle.add(panelConjuntos);


			panelFlechas.setBounds(70, 200, 120, 100);
			panelFlechas.setLayout(null);
			flecha1.setBounds(0, 30, 20, 20);
			flecha1.setName("Principio");
			flecha1.setIcon(new ImageIcon(getClass().getClassLoader().getResource(RutasIconos.Principio)));
			panelFlechas.add(flecha1);
			flecha2.setBounds(20, 30, 20, 20);
			flecha2.setName("Atras");
			flecha2.setIcon(new ImageIcon(getClass().getClassLoader().getResource(RutasIconos.Atras)));
			panelFlechas.add(flecha2);
			numero.setBounds(40, 30, 40, 20);
			panelFlechas.add(numero);
			flecha3.setBounds(80, 30, 20, 20);
			flecha3.setName("Adelante");
			flecha3.setIcon(new ImageIcon(getClass().getClassLoader().getResource(RutasIconos.Adelante)));
			panelFlechas.add(flecha3);
			flecha4.setBounds(100, 30, 20, 20);
			flecha4.setName("Final");
			flecha4.setIcon(new ImageIcon(getClass().getClassLoader().getResource(RutasIconos.Final)));
			panelFlechas.add(flecha4);
			panelDetalle.add(panelFlechas);



			panelDetalle.setBounds(12, 12, 600, 320);
			panelDetalle.setLayout(null);
			getContentPane().setBackground(new Color(189,250,107));
			getContentPane().setLayout(null);
			getContentPane().add(panelDetalle);
			
			Font fuente;
			if(!mensajes.getLocale().getLanguage().equals("zh")) {
				fuente = Fuentes.Fuente2;
			} else {
				fuente = Fuentes.Fuente0;
			}

			try {
				panelConjuntos.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), new String(mensajes.getString("ConjuntosResolutivos").getBytes("ISO-8859-1"),"UTF-8"), 4, 2, fuente, new Color(128, 128, 64)));
				panelDistancias.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), new String(mensajes.getString("DetalleDist").getBytes("ISO-8859-1"),"UTF-8"), 4, 2, fuente, new Color(128, 128, 64)));
				setTitle(new String(mensajes.getString("Detalle").getBytes("ISO-8859-1"),"UTF-8"));
				botonAceptar.setText(new String(mensajes.getString("Aceptar").getBytes("ISO-8859-1"),"UTF-8"));
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}


			scrollDistancias.setBounds(21, 30, 200, 210);
			panelDistancias.setBounds(275, 10, 250, 260);
			panelDistancias.setLayout(null);

			panelDistancias.add(scrollDistancias);
			botonAceptar.setBounds(230, 310, 85, 28);
			botonAceptar.setName("Aceptar");
			getContentPane().add(botonAceptar);
			panelDetalle.add(panelDistancias);

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


			class pulsarLista implements ListSelectionListener {

				public pulsarLista (ModalDetalle dialog) {
					super();
				}

				@SuppressWarnings("unchecked")
				public void valueChanged(ListSelectionEvent e) {
					JList lista = (JList)e.getSource();
					if(!lista.isSelectionEmpty()) {
						conjuntoSeleccionado = (ArrayList<Integer>)lista.getSelectedValue();
						Integer medidas[] = new Integer[conjuntoSeleccionado.size()];
						ArrayList<Vertice> vertices = panelEdicion.getGrafo().getVertices();
						String medidasString = "";
						String resultado[][] = new String[vertices.size()][2];
						for(int x = 0; x < vertices.size(); x++) {
							medidas = Utilidades.obtenerDistanciasResolutivas(x, conjuntoSeleccionado, panelEdicion, Resultados.getMatriz());
							resultado[x][0] = String.valueOf(((Vertice)vertices.get(x)).getId());
							medidasString = "[";
							for(int i = 0; i < medidas.length; i++) {
								medidasString = (new StringBuilder(String.valueOf(medidasString))).append(String.valueOf(medidas[i])).toString();
								if(i + 1 != medidas.length)
									medidasString = (new StringBuilder(String.valueOf(medidasString))).append(",").toString();
							}
							medidasString = (new StringBuilder(String.valueOf(medidasString))).append("]").toString();
							resultado[x][1] = medidasString;
						}

						TableModel modeloDistancias;
						try {
							modeloDistancias = new DefaultTableModel(resultado, new String[] {new String(mensajes.getString("abreviaturaVertice").getBytes("ISO-8859-1"),"UTF-8"), new String(mensajes.getString("Distancia").getBytes("ISO-8859-1"),"UTF-8")});
						tablaDistancias = new JTable();
						scrollDistancias.getHorizontalScrollBar().setPreferredSize(new Dimension(0, 15));
						scrollDistancias.getVerticalScrollBar().setPreferredSize(new Dimension(15, 0));
						scrollDistancias.setViewportView(tablaDistancias);
						tablaDistancias.setModel(modeloDistancias);
						tablaDistancias.getColumn(new String(mensajes.getString("abreviaturaVertice").getBytes("ISO-8859-1"),"UTF-8")).setMaxWidth(40);
						tablaDistancias.getColumn(new String(mensajes.getString("abreviaturaVertice").getBytes("ISO-8859-1"),"UTF-8")).setMinWidth(40);
						tablaDistancias.getColumn(new String(mensajes.getString("Distancia").getBytes("ISO-8859-1"),"UTF-8")).setMinWidth(158);
						tablaDistancias.getColumn(new String(mensajes.getString("Distancia").getBytes("ISO-8859-1"),"UTF-8")).setMaxWidth(800);
						tablaDistancias.setSize(275, 50);
						tablaDistancias.setCellSelectionEnabled(true);
						tablaDistancias.setEnabled(false);
						tablaDistancias.getTableHeader().setDoubleBuffered(false);
						tablaDistancias.getTableHeader().setBounds(0, 0, 287, 18);
						tablaDistancias.setAutoResizeMode(0);
						} catch (UnsupportedEncodingException e1) {
							e1.printStackTrace();
						}
					}
				}
			}
			pulsarLista lselectorLista = new pulsarLista(this);


			ActionListener pulsarBotones = 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("Principio")) {
							irAInicio();
						} else if(((JButton)obj).getName().equals("Atras")) {
							retroceder();
						} else if(((JButton)obj).getName().equals("Adelante")) {
							avanzar();
						} else if(((JButton)obj).getName().equals("Final")) {
							irAFin();
						}
					} else if (obj instanceof JTextField) {
						irAPagina();
					}
				}
			};


			botonAceptar.addActionListener(pulsarBotones);
			numero.addActionListener(pulsarBotones);
			flecha1.addActionListener(pulsarBotones);
			flecha2.addActionListener(pulsarBotones);
			flecha3.addActionListener(pulsarBotones);
			flecha4.addActionListener(pulsarBotones);
			listaConjuntos.addListSelectionListener(lselectorLista);
		}

		public void aceptar() {
			if(!Utilidades.esVaciaONula(conjuntoSeleccionado)) {
				ResultadosAction.mostrarResultado(conjuntoSeleccionado);
			}
			setVisible(false);
			dispose();
		}

		public void irAInicio() {
			pagina = new Vector<ArrayList<Integer>>();
			Vector<ArrayList<Integer>> resultados = Resultados.getResultados();
			int maximo = Math.min(resultados.size(), 10);
			for(int i=0; i<maximo ; i++) {
				pagina.add(resultados.get(i));
			}
			listaConjuntos.setListData(pagina);
			numero.setText("1");
			logger.info("Ir a primera página de resultados");
		}

		public void retroceder() {
			Integer numeroPagina = Integer.valueOf(numero.getText());
			if(numeroPagina > 1) {
				pagina = new Vector<ArrayList<Integer>>();
				Vector<ArrayList<Integer>> resultados = Resultados.getResultados();
				int maximo = Math.min(resultados.size(), 10*(numeroPagina-1));
				for(int i=10*(numeroPagina-2); i<maximo ; i++) {
					pagina.add(resultados.get(i));
				}
				listaConjuntos.setListData(pagina);
				numero.setText(String.valueOf(numeroPagina-1));
			}
			logger.info("Ir a página anterior de resultados");
		}

		public void avanzar() {
			Integer numeroPagina = Integer.valueOf(numero.getText());
			Vector<ArrayList<Integer>> resultados = Resultados.getResultados();
			if(numeroPagina < (resultados.size()/(float)10)) {
				pagina = new Vector<ArrayList<Integer>>();
				int maximo = Math.min(resultados.size(), 10*(numeroPagina+1));
				for(int i=10*numeroPagina; i<maximo ; i++) {
					pagina.add(resultados.get(i));
				}
				listaConjuntos.setListData(pagina);
				numero.setText(String.valueOf(numeroPagina+1));
			}
			logger.info("Ir a página siguiente de resultados");
		}

		public void irAFin() {
			pagina = new Vector<ArrayList<Integer>>();
			Vector<ArrayList<Integer>> resultados = Resultados.getResultados();
			int maximo = resultados.size();
			for(int i=(maximo-1)/10*10; i<maximo ; i++) {
				pagina.add(resultados.get(i));
			}
			listaConjuntos.setListData(pagina);
			numero.setText(String.valueOf((int)(Math.ceil(maximo/(float)10))));
			logger.info("Ir a última página de resultados");
		}

		public void irAPagina() {
			Integer numeroPagina = Integer.valueOf(numero.getText());
			Vector<ArrayList<Integer>> resultados = Resultados.getResultados();
			int maximo = resultados.size();
			if(numeroPagina <= (int)(Math.ceil(maximo/(float)10))) {
				pagina = new Vector<ArrayList<Integer>>();
				for(int i=10*(numeroPagina-1); i<maximo ; i++) {
					pagina.add(resultados.get(i));
				}
				listaConjuntos.setListData(pagina);
			} else {
				numero.setText(String.valueOf((int)(Math.ceil(maximo/(float)10))));
			}
		}
	}
}