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.BufferedWriter;
import java.io.FileWriter;
import java.io.UnsupportedEncodingException;
import java.util.ResourceBundle;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.filechooser.FileNameExtensionFilter;

import org.apache.log4j.Logger;

import utils.Constantes;
import utils.Fuentes;
import business.Arista;
import business.Grafo;
import business.Vertice;
import core.ModalAceptar;
import core.PanelEdicion;

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

	private PanelEdicion panelEdicion;

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

	public void actionPerformed(ActionEvent e) {
		ModalGuardar modal = new ModalGuardar();
		modal.setVisible(true);
	}


	private class ModalGuardar extends JDialog {

		private static final long serialVersionUID = 7598062286376439474L;
		private ResourceBundle mensajes;
		private JFileChooser selectorArchivo = new JFileChooser();
		private JTextArea nombre = new JTextArea();

		private ModalGuardar() {
			mensajes = panelEdicion.getMensajes();
			construirPanel();
		}

		private void construirPanel() {
			JPanel panelContenedor = new JPanel();
			JButton botonAceptar = new JButton();
			JButton botonCancelar = new JButton();

			try {
				setTitle(new String(mensajes.getString("Guardar").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();
			}

			for (int i = 0; i < selectorArchivo.getComponentCount(); i++) {
				selectorArchivo.getComponent(i).setBackground(new Color(189,250,107));
			}
			selectorArchivo.setFileFilter(new FileNameExtensionFilter("Grafo \t (*.gra)", "gra"));

			nombre.setBounds(12, 230, 476, 20);
			nombre.setBackground(Color.WHITE);
			nombre.setFont(Fuentes.Fuente1);

			botonAceptar.setName("Aceptar");
			botonCancelar.setName("Cancelar");
			botonAceptar.setBounds(160, 265, 85, 28);
			botonCancelar.setBounds(260, 265, 85, 28);

			panelContenedor.setBounds(-5, -5, 508, 230);
			panelContenedor.add(selectorArchivo);
			getContentPane().add(nombre);


			getContentPane().add(panelContenedor);
			getContentPane().add(botonAceptar);
			getContentPane().add(botonCancelar);
			getContentPane().setBackground(new Color(189,250,107));
			getContentPane().setLayout(null);


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

			ActionListener botones = 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();
						}
					}
				}
			};
			botonAceptar.addActionListener(botones);
			botonCancelar.addActionListener(botones);
		}


		public void aceptar() {
			try {
				String filename = "";
				if (selectorArchivo.getSelectedFile() != null) {
					filename = selectorArchivo.getSelectedFile().getAbsolutePath();
				} else {
					filename = selectorArchivo.getCurrentDirectory().getAbsolutePath() + "\\" + nombre.getText() + ".gra";
				}
				BufferedWriter bw = new BufferedWriter(new FileWriter(filename));
				Grafo grafo = panelEdicion.getGrafo();
				bw.write((new StringBuilder(String.valueOf(Integer.toString(grafo.getAristas().size())))).append("\r\n").toString());
				bw.write((new StringBuilder(String.valueOf(Integer.toString(grafo.getVertices().size())))).append("\r\n").toString());
				bw.write((new StringBuilder(String.valueOf(Integer.toString(grafo.getVerticeId())))).append("\r\n").toString());
				bw.write((new StringBuilder(String.valueOf(Integer.toString(grafo.getAristaId())))).append("\r\n").toString());
				int i = 0;
				int j = 0;
				Vertice nAux = null;
				if(grafo.getVertices().size() > 0)
					for(i = 0; i < grafo.getVertices().size(); i++) {
						nAux = (Vertice)grafo.getVertices().get(i);
						bw.write((new StringBuilder(String.valueOf(Integer.toString(nAux.getId())))).append("\r\n").toString());
						bw.write((new StringBuilder(String.valueOf(Integer.toString(nAux.getPunto().x)))).append("\r\n").toString());
						bw.write((new StringBuilder(String.valueOf(Integer.toString(nAux.getPunto().y)))).append("\r\n").toString());
						bw.write((new StringBuilder(String.valueOf(nAux.isSeleccionado()))).append("\r\n").toString());
					}

				Arista aAux = null;
				if(grafo.getAristas().size() > 0)
					for(j = 0; j < grafo.getAristas().size(); j++) {
						aAux = (Arista)grafo.getAristas().get(j);
						bw.write((new StringBuilder(String.valueOf(Integer.toString(aAux.getId())))).append("\r\n").toString());
						bw.write((new StringBuilder(String.valueOf(Integer.toString(aAux.getVerticeOrigen().getId())))).append("\r\n").toString());
						bw.write((new StringBuilder(String.valueOf(Integer.toString(aAux.getVerticeDestino().getId())))).append("\r\n").toString());
						bw.write((new StringBuilder(String.valueOf(aAux.isSeleccionada()))).append("\r\n").toString());
					}

				bw.flush();
				bw.close();
				logger.info("Grafo guardado correctamente");
				cancelar();
			} catch(Throwable exc) {
				error();
			}
		}


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


		public void error() {
			logger.error("Error al guardar el grafo");
			ModalAceptar modal = new ModalAceptar(panelEdicion.getMensajes(), Constantes.ERROR, "ErrorGuardarGrafo");
			modal.setVisible(true);
		}
	}
}