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.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.util.ResourceBundle;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JEditorPane;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;

import org.apache.log4j.Logger;

import utils.Fuentes;
import utils.RutasIconos;
import core.PanelEdicion;

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

	private PanelEdicion panelEdicion;

	public AyudaAction (PanelEdicion pEdicion) {
		panelEdicion = pEdicion;
	}

	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(b.getName().equals("Ayuda") || m.getName().equals("Ayuda")) {
			ModalAyuda modal = new ModalAyuda(panelEdicion);
			modal.setVisible(true);
		} else if(b.getName().equals("AcercaDe") || m.getName().equals("AcercaDe")) {
			ModalAcercaDe modal = new ModalAcercaDe(panelEdicion.getMensajes());
			modal.setVisible(true);
		}
	}


	private class ModalAcercaDe extends JDialog {

		private static final long serialVersionUID = 4347890234398224971L;

		private ModalAcercaDe (ResourceBundle mensajes) {
			JButton gnomito = new JButton();
			JLabel proyecto = new JLabel();
			JLabel autorTitulo  = new JLabel();
			JLabel autor = new JLabel();
			JLabel convocatoriaTitulo = new JLabel();
			JLabel convocatoria = new JLabel();
			JLabel departamentoTitulo = new JLabel();
			JLabel departamento = new JLabel();
			JLabel tutorTitulo = new JLabel();
			JLabel tutor = new JLabel();
			JButton botonAceptar = new JButton();
			try {
				setTitle(new String(mensajes.getString("Acerca").getBytes("ISO-8859-1"),"UTF-8"));
				proyecto.setText(new String(mensajes.getString("Proyecto").getBytes("ISO-8859-1"),"UTF-8"));
				autorTitulo.setText(new String(mensajes.getString("AutorTitulo").getBytes("ISO-8859-1"),"UTF-8"));
				autor.setText(new String(mensajes.getString("Autor").getBytes("ISO-8859-1"),"UTF-8"));
				convocatoriaTitulo.setText(new String(mensajes.getString("ConvocatoriaTitulo").getBytes("ISO-8859-1"),"UTF-8"));
				convocatoria.setText(new String(mensajes.getString("Convocatoria").getBytes("ISO-8859-1"),"UTF-8"));
				departamentoTitulo.setText(new String(mensajes.getString("DepartamentoTitulo").getBytes("ISO-8859-1"),"UTF-8"));
				departamento.setText(new String(mensajes.getString("Departamento").getBytes("ISO-8859-1"),"UTF-8"));
				tutorTitulo.setText(new String(mensajes.getString("TutorTitulo").getBytes("ISO-8859-1"),"UTF-8"));
				tutor.setText(new String(mensajes.getString("Tutor").getBytes("ISO-8859-1"),"UTF-8"));
				botonAceptar.setText(new String(mensajes.getString("Aceptar").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")) {
				proyecto.setFont(Fuentes.Fuente2);
				autorTitulo.setFont(Fuentes.Fuente2);
				autor.setFont(Fuentes.Fuente2);
				convocatoriaTitulo.setFont(Fuentes.Fuente2);
				convocatoria.setFont(Fuentes.Fuente2);
				departamentoTitulo.setFont(Fuentes.Fuente2);
				departamento.setFont(Fuentes.Fuente2);
				tutorTitulo.setFont(Fuentes.Fuente2);
				tutor.setFont(Fuentes.Fuente2);
			} else {
				proyecto.setFont(Fuentes.Fuente0);
				autorTitulo.setFont(Fuentes.Fuente0);
				autor.setFont(Fuentes.Fuente0);
				convocatoriaTitulo.setFont(Fuentes.Fuente0);
				convocatoria.setFont(Fuentes.Fuente0);
				departamentoTitulo.setFont(Fuentes.Fuente0);
				departamento.setFont(Fuentes.Fuente0);
				tutorTitulo.setFont(Fuentes.Fuente0);
				tutor.setFont(Fuentes.Fuente0);
			}

			arriba.setBounds(70, 10, 250, 25);
			arriba.add(proyecto);
			getContentPane().add(arriba);


			gnomito.setBounds(0, 40, 58, 92);
			gnomito.setIcon(new ImageIcon(getClass().getClassLoader().getResource(RutasIconos.Gnomito)));
			gnomito.setFocusable(false);
			autorTitulo.setBounds(90, 30, 200, 20);
			autor.setBounds(200, 30, 200, 20);
			convocatoriaTitulo.setBounds(90, 60, 200, 20);
			convocatoria.setBounds(200, 60, 200, 20);
			departamentoTitulo.setBounds(90, 90, 200, 20);
			departamento.setBounds(200, 90, 200, 20);
			tutorTitulo.setBounds(90, 120, 200, 20);
			tutor.setBounds(200, 120, 200, 20);
			medio1.setBounds(20, 30, 380, 150);
			medio1.setLayout(null);
			medio1.add(gnomito);
			medio1.add(autor);
			medio1.add(convocatoria);
			medio1.add(departamento);
			medio1.add(tutor);
			getContentPane().add(medio1);


			medio2.setLayout(null);
			medio2.setBounds(17, 30, 380, 150);
			medio2.add(autorTitulo);
			medio2.add(convocatoriaTitulo);
			medio2.add(departamentoTitulo);
			medio2.add(tutorTitulo);
			getContentPane().add(medio2);


			botonAceptar.setName("Aceptar");
			botonAceptar.setPreferredSize(new Dimension(85, 28));
			abajo.setBounds(0, 180, 400, 40);
			abajo.add(botonAceptar);
			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();
						}
					}
				}
			};
			botonAceptar.addActionListener(acept);
		}

		public void aceptar() {
			setVisible(false);
			dispose();
		}
	}
	
	private class ModalAyuda extends JDialog {

		private static final long serialVersionUID = -565829381163478656L;
		private JPanel panelContenedor;
		private JTree panelIzquierda;
		private JEditorPane panelDerecha;
		private JButton botonAceptar;
		private ResourceBundle mensajes;


		private ModalAyuda(PanelEdicion pEdicion) {
			mensajes = pEdicion.getMensajes();
			botonAceptar = new JButton();
			construirPanel();
		}

		private void construirPanel() {
			try {
				try {
					setTitle(new String(mensajes.getString("Ayuda").getBytes("ISO-8859-1"),"UTF-8"));
					botonAceptar.setText(new String(mensajes.getString("Aceptar").getBytes("ISO-8859-1"),"UTF-8"));
				} catch (UnsupportedEncodingException e) {
					e.printStackTrace();
				}

				DefaultMutableTreeNode top = new DefaultMutableTreeNode(new String(mensajes.getString("TablaContenidos").getBytes("ISO-8859-1"),"UTF-8"));
				crearCarpetas(top);
				panelIzquierda = new JTree(top);
				panelIzquierda.getSelectionModel().setSelectionMode(1);
				panelIzquierda.addTreeSelectionListener(new TreeSelectionListener() {

					public void valueChanged(TreeSelectionEvent e) {
						DefaultMutableTreeNode node = (DefaultMutableTreeNode)e.getPath().getLastPathComponent();
						Object nodeInfo = node.getUserObject();
						if(node.isLeaf()) {
							ElementoHtml nodo = (ElementoHtml)nodeInfo;
							mostrarElemento(nodo.ruta);
						}
					}
				}
				);
				panelContenedor = new JPanel();
				panelContenedor.setBounds(0, 12, 705, 391);
				JScrollPane treeView = new JScrollPane(panelIzquierda);
				panelDerecha = new JEditorPane();
				panelDerecha.setEditable(false);

				botonAceptar.setName("Aceptar");
				botonAceptar.setBounds(310, 380, 85, 28);
				getContentPane().add(botonAceptar);

				JScrollPane htmlView = new JScrollPane(panelDerecha);
				JSplitPane splitPane = new JSplitPane(1);
				splitPane.setTopComponent(treeView);
				splitPane.setBottomComponent(htmlView);
				Dimension minimumSize = new Dimension(100, 50);
				htmlView.setMinimumSize(minimumSize);
				htmlView.setPreferredSize(new Dimension(189, 256));
				treeView.setMinimumSize(minimumSize);
				treeView.setPreferredSize(new Dimension(179, 252));
				splitPane.setDividerLocation(200);
				splitPane.setDividerSize(20);
				panelContenedor.add(splitPane);
				add(panelContenedor);
				splitPane.setBounds(11, 12, 567, 241);
				splitPane.setFocusTraversalPolicyProvider(true);
				splitPane.setPreferredSize(new Dimension(669, 350));
				setSize(710, 450);
				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));
			} catch(Exception e) {
				e.printStackTrace();
			}
			ActionListener botones = new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					Object obj = e.getSource();
					if (obj instanceof JButton) {
						if(((JButton)obj).getName().equals("Aceptar")) {
							setVisible(false);
							dispose();
						}
					}
				}
			};

			botonAceptar.addActionListener(botones);
		}

		private void mostrarElemento(URL html) {
			try	{
				panelDerecha.setPage(html);
			} catch(IOException e) {
				logger.error("Error al abrir la página de ayuda seleccionada");
			}
		}

		private void crearCarpetas(DefaultMutableTreeNode top) {
			try {
				DefaultMutableTreeNode carpeta = null;
				DefaultMutableTreeNode elemento = null;
				carpeta = new DefaultMutableTreeNode(new String(mensajes.getString("CrearGrafo").getBytes("ISO-8859-1"),"UTF-8"));
				top.add(carpeta);
				elemento = new DefaultMutableTreeNode(new ElementoHtml(new String(mensajes.getString("PanelEdicion").getBytes("ISO-8859-1"),"UTF-8"), "PanelEdicion"));
				carpeta.add(elemento);
				elemento = new DefaultMutableTreeNode(new ElementoHtml(new String(mensajes.getString("GrafoAleatorio").getBytes("ISO-8859-1"),"UTF-8"), "Aleatorio"));
				carpeta.add(elemento);
				elemento = new DefaultMutableTreeNode(new ElementoHtml(new String(mensajes.getString("GrafoCiclo").getBytes("ISO-8859-1"),"UTF-8"), "Ciclo"));
				carpeta.add(elemento);
				elemento = new DefaultMutableTreeNode(new ElementoHtml(new String(mensajes.getString("GrafoCompleto").getBytes("ISO-8859-1"),"UTF-8"), "Completo"));
				carpeta.add(elemento);
				elemento = new DefaultMutableTreeNode(new ElementoHtml(new String(mensajes.getString("GrafoRueda").getBytes("ISO-8859-1"),"UTF-8"), "Rueda"));
				carpeta.add(elemento);
				elemento = new DefaultMutableTreeNode(new ElementoHtml(new String(mensajes.getString("Arbol").getBytes("ISO-8859-1"),"UTF-8"), "Arbol"));
				carpeta.add(elemento);
				elemento = new DefaultMutableTreeNode(new ElementoHtml(new String(mensajes.getString("ArbolEstrella").getBytes("ISO-8859-1"),"UTF-8"), "Estrella"));
				carpeta.add(elemento);
				elemento = new DefaultMutableTreeNode(new ElementoHtml(new String(mensajes.getString("3D").getBytes("ISO-8859-1"),"UTF-8"), "3D"));
				carpeta.add(elemento);
				carpeta = new DefaultMutableTreeNode(new String(mensajes.getString("ManipularGrafo").getBytes("ISO-8859-1"),"UTF-8"));
				top.add(carpeta);
				elemento = new DefaultMutableTreeNode(new ElementoHtml(new String(mensajes.getString("AbrirGrafo").getBytes("ISO-8859-1"),"UTF-8"), "Abrir"));
				carpeta.add(elemento);
				elemento = new DefaultMutableTreeNode(new ElementoHtml(new String(mensajes.getString("GuardarGrafo").getBytes("ISO-8859-1"),"UTF-8"), "Guardar"));
				carpeta.add(elemento);
				elemento = new DefaultMutableTreeNode(new ElementoHtml(new String(mensajes.getString("BorrarGrafo").getBytes("ISO-8859-1"),"UTF-8"), "Borrar"));
				carpeta.add(elemento);
				elemento = new DefaultMutableTreeNode(new ElementoHtml(new String(mensajes.getString("CambiarComponentes").getBytes("ISO-8859-1"),"UTF-8"), "Cambiar"));
				carpeta.add(elemento);
				carpeta = new DefaultMutableTreeNode(new String(mensajes.getString("PropiedadesGrafo").getBytes("ISO-8859-1"),"UTF-8"));
				top.add(carpeta);
				elemento = new DefaultMutableTreeNode(new ElementoHtml(new String(mensajes.getString("Matrices").getBytes("ISO-8859-1"),"UTF-8"), "Matrices"));
				carpeta.add(elemento);
				elemento = new DefaultMutableTreeNode(new ElementoHtml(new String(mensajes.getString("TitGemelos").getBytes("ISO-8859-1"),"UTF-8"), "Gemelos"));
				carpeta.add(elemento);
				elemento = new DefaultMutableTreeNode(new ElementoHtml(new String(mensajes.getString("VerticesAristas").getBytes("ISO-8859-1"),"UTF-8"), "VerticesAristas"));
				carpeta.add(elemento);
				carpeta = new DefaultMutableTreeNode(new String(mensajes.getString("DimensionMetrica").getBytes("ISO-8859-1"),"UTF-8"));
				top.add(carpeta);
				elemento = new DefaultMutableTreeNode(new ElementoHtml(new String(mensajes.getString("CalcularDimensionMetrica").getBytes("ISO-8859-1"),"UTF-8"), "Dimension"));
				carpeta.add(elemento);
				elemento = new DefaultMutableTreeNode(new ElementoHtml(new String(mensajes.getString("VerResultados").getBytes("ISO-8859-1"),"UTF-8"), "Resultados"));
				carpeta.add(elemento);
				elemento = new DefaultMutableTreeNode(new ElementoHtml(new String(mensajes.getString("MasDetalles").getBytes("ISO-8859-1"),"UTF-8"), "Detalles"));
				carpeta.add(elemento);
				elemento = new DefaultMutableTreeNode(new ElementoHtml(new String(mensajes.getString("LimpiarResultados").getBytes("ISO-8859-1"),"UTF-8"), "Limpiar"));
				carpeta.add(elemento);
				elemento = new DefaultMutableTreeNode(new ElementoHtml(new String(mensajes.getString("AplicarDijkstra").getBytes("ISO-8859-1"),"UTF-8"), "Dijkstra"));
				carpeta.add(elemento);
				carpeta = new DefaultMutableTreeNode(new String(mensajes.getString("Personalizar").getBytes("ISO-8859-1"),"UTF-8"));
				top.add(carpeta);
				elemento = new DefaultMutableTreeNode(new ElementoHtml(new String(mensajes.getString("opciones").getBytes("ISO-8859-1"),"UTF-8"), "Opciones"));
				carpeta.add(elemento);
				elemento = new DefaultMutableTreeNode(new ElementoHtml(new String(mensajes.getString("Zoom").getBytes("ISO-8859-1"),"UTF-8"), "Zoom"));
				carpeta.add(elemento);
				elemento = new DefaultMutableTreeNode(new ElementoHtml(new String(mensajes.getString("Idiomas").getBytes("ISO-8859-1"),"UTF-8"), "Idiomas"));
				carpeta.add(elemento);
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
		}

		private class ElementoHtml{

			public String nombre;
			public URL ruta;

			public ElementoHtml(String carpeta, String html) {
				nombre = carpeta;
				String idioma = mensajes.getLocale().getLanguage();
				String htmlRuta = "html/" + html + "_" + idioma + ".html";
				ruta = getClass().getClassLoader().getResource(htmlRuta);
			}

			public String toString() {
				return nombre;
			}
		}
	}
}